我试图从我的程序中释放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图像的任何建议吗?
答案 0 :(得分:2)
waitKey(-1)等待键盘输入,而waitKey(10)使用10 ms更新UI,然后进一步控制;似乎你的问题不是释放,而是适当的更新。
通常一个人不需要释放Mat(尽管我在Java中看到了一些release()调用),只需重新分配即可。您的问题也可能与引用数量为零时被杀死的智能指针有关,但很难说没有看到您的代码。
在创建,分配和声明Mats时会发生一些棘手的事情。另外,请注意,例如,Mat m = n,仅复制参考,但Mat m = n + 0,复制整个对象。