使用opencv获取帧视频

时间:2014-04-21 04:13:31

标签: c++ opencv video-processing

这是我从视频中获取帧的代码。我希望在循环和条件的视频中显示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个不同的图像

enter image description here

但是当我改变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显示相同的图片, enter image description here

我不知道为什么会出现奇怪的结果,请告诉我如何修复它,谢谢

2 个答案:

答案 0 :(得分:3)

这样的作业:

image1 = frame;

只会执行副本。 Mat结构被复制,像素共享

所以,在你的第二个例子中,你用当前帧覆盖了image1。如果你想“缓存”Mats,请使用:

image1 = frame.clone(); // deep copy

答案 1 :(得分:1)

您面临的问题基本上是在OpenCV Mat的重载=运算符中缺少对copy-on-write的支持。它基本上意味着image1frame将共享其数据。

一种方便的方法是,当您编写image1 = frame,称为&#34;浅层复制&#34;时,您需要为Mat {{1}创建参考image1 }}。因此,在显示frame后的20次迭代中,您实际上正在显示image1

如果您写的是frame之类的内容,则不会出现这种情况,因为在这种情况下,您实际上正在制作image1 = frame.clone()的单独副本。

同时检查this

相关问题