繁体   English   中英

使用opencv获取帧视频

[英]Get frame video with opencv

这是我从视频中获取帧的代码。 我想在视频中显示带有循环和条件的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窗口显示与image2相同的图片, 在此处输入图片说明

我不知道为什么会显示奇怪的结果,请告诉我如何解决,谢谢

这样的作业:

image1 = frame;

只做一个浅表副本。 Mat结构被复制,像素被共享

因此,在第二个示例中,您将使用当前帧覆盖image1。 如果要“缓存”垫子,请使用:

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

您所面临的基本上是在OpenCV Mat的重载=运算符中缺少对写时复制的支持。 这基本上意味着image1frame将共享它们的数据。

一种简便的查看方法是,当您编写image1 = frame (称为“浅层复制”),您将为Mat frame创建一个参考image1 因此,当显示image1 ,经过20次迭代后,实际上是在显示frame本身。

如果您编写了诸如image1 = frame.clone() ,则不会是这种情况,因为在这种情况下,您实际上是在制作frame的单独副本。

还要检查这个了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM