使用 openCV(.release() 和 =Mat() 释放 Mat 图像不起作用)
Posted
技术标签:
【中文标题】使用 openCV(.release() 和 =Mat() 释放 Mat 图像不起作用)【英文标题】:Releasing Mat images with openCV(.release() and =Mat() doesn't work) 【发布时间】:2014-03-01 17:57:20 【问题描述】:我试图从我的程序中释放一个 Mat 图像,但是,无论我如何尝试,当我单击“处理按钮”处理另一个图像(来自加载或捕捉)时,仍然会出现相同的图像(结果)一个图像)。将始终显示旧结果。
我必须关闭整个程序,打开下一张我要处理的图像,然后单击“处理按钮”以获得实际结果。但是,这并不理想,因为我希望我的程序立即处理我加载或捕捉的图像,而不必关闭整个程序(或者停止运行并再次单击运行)
我从谷歌搜索的大部分结果都建议了这些方法:
imagep.release(); //where imagep is the image after going through processing
imagep=Mat();
更新: 我的代码是沿着这条线走的。在我的 program.h 文件中,图像和图像 p 并声明如下:
class program : public QMainWindow
Q_OBJECT
public:
program(QWidget *parent = 0);
~program();
cv::Mat image, imagep; //original image and image processed
.cpp 文件中按钮的编码如下所示:
imagep = image.clone(); //also tried: imagep=image, and imagep=image+0 already.
.
.
.
processing/segmenting steps
.
.
cv::imshow("new image", imagep);
cvWaitKey(10);
imagep=Mat(); //also tried cvDestroyWindow("new image"), //imagep.release();
imagep图片的设置(我根据图像处理的结果更改了像素的值。)通过以下方式创建:
for (int i=0; i< imagep.rows; ++i)
for (int j=0; j<imagep.cols; ++j)
//imagep.at<cv::Vec3b>(i,j)= v_char[i]; Note that this is commented. This method doesn't work, hence the below method. But it doesn't work too.
Vec3b temp=v_char[i];
imagep.at<cv::Vec3b>(i,j)[0]=temp[0];
imagep.at<cv::Vec3b>(i,j)[1]=temp[1];
imagep.at<cv::Vec3b>(i,j)[2]=temp[2];
但是,这些方法不起作用。关于如何发布 Mat 图像的任何建议?
【问题讨论】:
那么问题是你imagep
没有正确销毁?
是的。你知道可能是什么原因吗?
是你从来不破坏窗口的问题吗?或者实际的imagep
变量没有被破坏?
imagep 变量没有被破坏。交互也是通过 GUI 完成的,所以破坏窗口的常用方法是等待键,但是,我根本不希望用户触摸键盘,他/她只有鼠标。
见answers.opencv.org/question/14285/… 只有拥有内存才会被释放
【参考方案1】:
waitKey(-1) 等待键盘输入,而 waitKey(10) 使用 10 毫秒来更新 UI,然后传递给进一步的控制;看来您的问题不是发布,而是正确更新。
通常不需要释放 Mat(尽管我在 Java 中看到了一些 release() 调用),只需重新分配它。您的问题也可能与引用数量为零时被杀死的智能指针有关,但如果没有看到您的代码就很难说。
在创建、分配和声明 Mats 时会发生一些棘手的事情。另外,请注意,例如 Mat m = n,仅复制引用,但 Mat m = n + 0,复制整个对象。
【讨论】:
感谢您的回答,是的,我也尝试了不同时间的 waitKey(),但无济于事。正如您所说,最初的计划是重新分配 Mat,就像在 image 的情况下,当一个新的图像被捕捉时,Mat 被重新分配没有问题,但是当涉及到 imagep 时,Mat 无法被重新分配。这就是我试图发布图像的原因。已经尝试过 Mat m=n 和 Mat m=n+0 的方法,但它不起作用:/ 我添加了一点我的代码,希望你能从我的那一点代码中看出问题所在。无论如何都赞成您的回答,再次感谢您的建议。 我查看了您的代码,到目前为止没有发现任何错误。究竟是什么问题?我不太明白不发布是如何产生问题的。你说没用。这是否意味着您看不到图像如何变化?你能告诉我你需要/期望什么以及实际会发生什么吗? 我意识到为什么无法分配或发布新图像。因为向量 v_char[i] 声明不知何故消失了:/ 因此,每次单击按钮,因为没有声明,处理只是添加到图像中。我的后见之明:(在编译时很难调试这些东西现在显示错误。但是,由于您是唯一一个回答的人,因此除了我给您的赞成票之外,还有一个接受的答案。谢谢(: 谢谢,没问题;你没有提到任何关于神秘按钮的事情。如果您显示了您的整个代码,包括编译器错误,我们会更快地解决这个问题。你会写 android 应用吗?以上是关于使用 openCV(.release() 和 =Mat() 释放 Mat 图像不起作用)的主要内容,如果未能解决你的问题,请参考以下文章
在vc6中用opencv写了一个小游戏,debug下可以正常运行,但是release之后,不能运行。
在release模式下编译opencv写的人脸检测代码,提示:无法打开输入文件“opencv_calib3d244.lib”