VideoCapture: copy the captured frame, to avoid dangling Mats

Previously, VideoCapture::retrieve would return a Mat that referenced
the internal IplImage. Since the latter is rewritten every time a
frame is captured, it means that if the user captures two frames in a row,
the first frame would reference nothing. Similar if a user captures a frame,
then destroys the VideoCapture instance.

Note that the other branch of the if isn't affected, since flip allocates
a new Mat.
This commit is contained in:
Roman Donchenko 2013-10-29 18:14:41 +04:00
parent c5e8a9a29b
commit d6a7a6d503

View File

@ -523,7 +523,7 @@ bool VideoCapture::retrieve(Mat& image, int channel)
return false; return false;
} }
if(_img->origin == IPL_ORIGIN_TL) if(_img->origin == IPL_ORIGIN_TL)
image = Mat(_img); Mat(_img).copyTo(image);
else else
{ {
Mat temp(_img); Mat temp(_img);