OpenCV c++ Mat MADNESS

Posted

技术标签:

【中文标题】OpenCV c++ Mat MADNESS【英文标题】: 【发布时间】:2016-04-14 13:38:07 【问题描述】:

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

所以在 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,它就不起作用。

【问题讨论】:

所有矩阵的类型都是CV_64FC1?如果不是,这可能会中断。你不应该从 Main 类的实例中调用 printMat 吗?顺便说一句,您可以简单地使用cout &lt;&lt; mat &lt;&lt; endl; 打印矩阵 认为它默认为 1 通道不确定。无论如何,这是我的错误,我写了一个答案。 Guess rookie error referenc vs value error,但容易混淆。 我不明白你为什么在打印时转置矩阵(你的代码打印一行中每一列的值,然后换行并转到下一行),也不明白你为什么不使用cout,但你可以用更易读的东西完成同样的任务(恕我直言):for (int j = 0, j &lt; cols; j++ ) for (int i = 0, i &lt; rows; i++ ) printf( "%lf ", mat.at&lt;double&gt;(i,j)); printf("\n"); 抱歉抱歉,已编辑 =] 【参考方案1】:

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

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

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();

原来构造函数使用数组的 referenceNOT 值,所以当我离开该方法时,我会将那部分内存丢给垃圾收集器。

在我提到的那条线之后它被打破的事实仅仅是巧合。 (因为那是一种不同的方法,此时 GC 决定清理)

【讨论】:

C++ 中没有垃圾收集器 ;D ahaha 随意修复,这 c++ 东西太不合我意了 我不能。我什至不明白问题出在哪里,因为您没有显示所有相关代码。我想你可以删除这个问题,因为你找到了一个修复程序,但是没有关于其他人如何从中受益的信息。 问题是创建垫子时引用的数组,值没有复制到垫子中。我不知道如何正确措辞,请随意评论更好的措辞并稍后对其进行编辑。

以上是关于OpenCV c++ Mat MADNESS的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV C++ Mat == 运算符

C++ OpenCV Mat 像素值和 OpenCV 错误

OpenCV C# 像 C++ 一样迭代 Mat 对象

无法同时显示五个 Mat 图像(C++、OpenCV)

OpenCV c++ Mat MADNESS

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?