Opencv 视频

Opencv读取视频资料下载

OpenCV中常见的视频方式是while循环读取,可是,当遇到嵌套循环呢

1、常见的while循环 ,没有嵌套循环

cv::VideoCapture capture(“d:/test/demo.avi”);
if (!capture.isOpened())
return -1;
bool status = true; // 判断循环是否中止的布尔量
cv::Mat frame;
while (status)
{
capture >> frame;
if (frame.empty())
break;
cv::imshow(“video”, frame);
if (cv::waitKey(27) >= 0)
status = false;
}
2、当有嵌套循环时
// 路径的话,可以用’\’ 也可以用’/’
cv::VideoCapture capture(0);
if (!capture.isOpened())
return -1;
cv::VideoCapture demoCapture(“d:/test/demo.avi”);
if (!demoCapture.isOpened())
return -2;

// 获取对应视频文件的总帧数
static int count = demoCapture.get(CV_CAP_PROP_FRAME_COUNT);
bool status = true;  // 判断循环是否中止的布尔量
cv::Mat frame;
cv::Mat demoFrame;

while(status)
{
    capture >> frame;
    if (frame.empty())
        break;

    // 用来指定跳转帧的位置  static使之不会随着下次循环重新被赋值1
    // 在这个测试代码里面它可以被提出循环,考虑分模块编程的情况放到这里吧
    static int position = 1;  

    // 用什么作为循环判断条件,根据需求吧,不是唯一解  
    while (position)
    {
        // 跳转到指定帧(第position帧)
        demoCapture.set(CV_CAP_PROP_POS_FRAMES, position);
        demoCapture >> demoFrame;
        if (demoFrame.empty())
            break;

        // 代码1开始
        // 这一块代码可以做好多种事情,
        // 比如说demoFrame和frame进行ROI操作  
        ...
        // 代码1结束

        // 假如想让视频一遍结束继续播放,那就重置
        // 当然也可以根据需求更改
        if(position == count)
            position = 0;
        position++;

        if (cv::waitKey(27) >= 0)
            position = 0;
    }

猜你喜欢

转载自blog.csdn.net/tianli3151/article/details/84761580