【发布时间】: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/… 只有拥有内存才会被释放
标签: opencv image-processing computer-vision