使用 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之后,不能运行。

OpenCV与Debug和Release模式

opencv nameWindow 窗口名字乱码

在release模式下编译opencv写的人脸检测代码,提示:无法打开输入文件“opencv_calib3d244.lib”

关于在Opencv中使用Releaseimread时候出现,错误

OpenCV参考手册之Mat类详解