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 << mat << endl;
打印矩阵
认为它默认为 1 通道不确定。无论如何,这是我的错误,我写了一个答案。 Guess rookie error referenc vs value error,但容易混淆。
我不明白你为什么在打印时转置矩阵(你的代码打印一行中每一列的值,然后换行并转到下一行),也不明白你为什么不使用cout
,但你可以用更易读的东西完成同样的任务(恕我直言):for (int j = 0, j < cols; j++ ) for (int i = 0, i < rows; i++ ) printf( "%lf ", mat.at<double>(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();
原来构造函数使用数组的 reference 而 NOT 值,所以当我离开该方法时,我会将那部分内存丢给垃圾收集器。
在我提到的那条线之后它被打破的事实仅仅是巧合。 (因为那是一种不同的方法,此时 GC 决定清理)
【讨论】:
C++ 中没有垃圾收集器 ;D ahaha 随意修复,这 c++ 东西太不合我意了 我不能。我什至不明白问题出在哪里,因为您没有显示所有相关代码。我想你可以删除这个问题,因为你找到了一个修复程序,但是没有关于其他人如何从中受益的信息。 问题是创建垫子时引用的数组,值没有复制到垫子中。我不知道如何正确措辞,请随意评论更好的措辞并稍后对其进行编辑。以上是关于OpenCV c++ Mat MADNESS的主要内容,如果未能解决你的问题,请参考以下文章