这是我从视频中获取帧的代码。我希望在循环和条件的视频中显示2帧。
int main( int argc, char** argv )
{
string fileName = "E:\\Tugas Akhir\\Video Master\\city_1.avi";
Mat image1;
Mat image2;
Mat frame;
cv::Mat result;
VideoCapture cap(fileName);
if(!cap.isOpened())
return -1;
Mat edges;
for(int loop=0;;loop++)
{
//std::cout<<loop<<endl;
cap >> frame; // get a new frame from camera
if(loop>0 && (loop%20)==0){
//std::cout<<"frame 2"<<endl;
image2=frame;
**imshow("image2",image2);**
break;
}else if(loop==0){
image1=frame;
**imshow("image1",image1);**
//std::cout<<"frame 1"<<endl;
}
//loop++;
if(waitKey(30) >= 0) break;
}
waitKey(0);
return 0;
}
这是结果,2个窗口有2个不同的图像
但是当我改变imshow(“image1”,image1)方法位置......
if(loop>0 && (loop%20)==0){
//std::cout<<"frame 2"<<endl;
image2=frame;
**imshow("image1",image1);**
**imshow("image2",image2);**
break;
}else if(loop==0){
image1=frame;
//std::cout<<"frame 1"<<endl;
}
image1 windows与image2显示相同的图片,
我不知道为什么会出现奇怪的结果,请告诉我如何修复它,谢谢
答案 0 :(得分:3)
这样的作业:
image1 = frame;
只会执行浅副本。 Mat结构被复制,像素共享
所以,在你的第二个例子中,你用当前帧覆盖了image1。如果你想“缓存”Mats,请使用:
image1 = frame.clone(); // deep copy
答案 1 :(得分:1)
您面临的问题基本上是在OpenCV Mat的重载=
运算符中缺少对copy-on-write的支持。它基本上意味着image1
和frame
将共享其数据。
一种方便的方法是,当您编写image1 = frame
,称为&#34;浅层复制&#34;时,您需要为Mat {{1}创建参考image1
}}。因此,在显示frame
后的20次迭代中,您实际上正在显示image1
。
如果您写的是frame
之类的内容,则不会出现这种情况,因为在这种情况下,您实际上正在制作image1 = frame.clone()
的单独副本。
同时检查this。