Reputation: 2106
I have tried to release a Mat image from my program, however, no matter how I tried it, the same image (result) still appear when I click on the "process button" to process another image (from loading or snapping an image). The old results will always be displayed.
I have to close the whole program, open the next image I want to process and click the "process button" to get the actual result. However, this is not ideal, as I want my program to immediately process the image I load or snap and not having to close the whole program(or rather stop run and click run again)
Most of the results I searched from google suggested these methods:
imagep.release(); //where imagep is the image after going through processing
imagep=Mat();
UPDATE: My code is goes something along this line. In my program.h file, the image and image p and declared like this:
class program : public QMainWindow
{
Q_OBJECT
public:
program(QWidget *parent = 0);
~program();
cv::Mat image, imagep; //original image and image processed
The coding for the button in the .cpp file goes something like this:
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();
The setting of the picture of imagep(where I changed the values of the pixels based on results from the image processing. ) is created via:
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];
}
}
However, these methods doesn't work. Any suggestions of how I can release the Mat image?
Upvotes: 0
Views: 3990
Reputation: 4525
waitKey(-1) wait for a keyboard input while waitKey(10) uses 10 ms to update UI and then passes to control further on; It seems to that your problem is not release but proper update.
Normally one don’t need to release Mat (though I saw some release() calls in Java), just reassign it. Your problem may also be related to smart pointers that got killed when the number of references goes to zero but it is hard to say without seeing your code.
There are some tricky things happening when creating, assigning, and declaring Mats. Also, note for example that Mat m = n, copies the reference only but Mat m = n + 0, copies the whole object.
Upvotes: 2