c++ - OpenCV c++ Mat MADNESS

标签 c++ linux opencv matrix

所以我有一个包含三个全局 Mat 的对象(请耐心等待),我希望填充 double ,我还有一个打印方法

所以在Main.hpp

Main class {
...
Mat FIXED;
Mat one;
Mat two;
...
}

在我的 Main.cpp 中有

void Main::printMat( Mat mat ) {
    int rows = mat.rows;
    int cols = mat.cols;
    for (int j = 0, j < cols; j++ ) { 
        for (int i = 0, i < rows; i++ ) { 
            printf( "%lf ", mat.at<double>(i,j)); 
        } 
        printf("\n");
    }
}

因此对于任何矩阵输入,它的所有内容都可以正常存储。

printMat(one); <--this works

这很好用,但后来我做到了

two = FIXED.clone(); 

然后就崩溃了,我不知道为什么要帮忙

printMat(one); <--this doesnt work

如果我注释掉 .clone() 行它会起作用,如果我制作一个相同大小的空白矩阵并保存到 FIXED 它不起作用。

最佳答案

对于任何为此苦苦挣扎的人,原因是我如何创建一个数组。

所以我最初做了一个打印方法,因为

cout << someMat << endl;

给我奇怪的数字

事实证明那是错误所在,它应该给我存储的正常值。

我通过传入 Array[row][col] 使用方法在方法中制作 Mat

void foo() {
    one = Mat(Array.rows, Array.cols, CV_64F, Array);
}

void bar() {
 printMat(one)//error happens here
}

main (...) {
    foo();
    bar();
}

事实证明,构造函数使用数组的引用不是 值,因此当我离开该方法时,我将那部分内存丢失给垃圾收集器。

它在我提到的那条线之后断线的事实纯属巧合。 (因为那是在不同的方法中,GC 决定清理这一点)

关于c++ - OpenCV c++ Mat MADNESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36624872/

相关文章:

c++ - 贯穿整个项目的一种方法

linux - Ubuntu 上的 Docker 无法连接到本地主机,但可以连接到其 ip

xml - 使用 Accord.NET 解析 HaarCascade XML - 节点类型不支持 ReadElementContentAsString 方法 None

c++ - OpenCV - moments() 函数中的参数

c++ - 清理 QList 和 QGraphicsScene 以避免内存泄漏

c++ - 在 ns3 中声明 GnuplotHelper 失败

opencv - 使用虚拟相机进行立体校准

ios - 在 ios 中使用 opencv 用网格变换图像的特定区域

c++ - 在执行时删除 lambda 是否有效?

java - 在Linux系统上部署Java项目