OpenCV处理指定帧画面

来源:互联网 发布:防范和打击电信网络 编辑:程序博客网 时间:2024/06/06 08:49

OpenCV处理指定帧画面

在使用OpenCV进行视频处理的项目中,有些时候需要对视频中的指定帧进行处理。最朴素的想法是读进视频流数据后,遍历至指定帧画面进行处理后返回。这显然存在严重的时间浪费,其实OpenCV的VideoCapture对象提供了直接访问视频指定帧画面的方法。一下对两种访问方式进行介绍,并给出两种方法处理时间的对比。
1. 循环遍历

#include <opencv.hpp>using namespace std;using namespace cv;int main(){    string videoName = "./data/11.mp4";    VideoCapture cap(videoName);    Mat frame;    clock_t t1 = clock();    for (size_t i = 0; i < cap.get(CV_CAP_PROP_FRAME_COUNT); i++)    {        if (i == 1000)        {            clock_t t2 = clock();            cout << "循环遍历方式用时:" << t2 - t1 << "ms" << endl;        }        else        {            cap >> frame;            continue;        }    }    system("pause");    return 0;}// 输出结果:循环遍历方式用时:2836ms

2. 利用VideoCapture对象的set方法
该方法通过VideoCapture对象的set方法,使用其CV_CAP_PROP_POS_FRAMES属性将VideoCapture对象的起始帧设置到指定位置。

#include <opencv.hpp>using namespace std;using namespace cv;int main(){    string videoName = "./data/11.mp4";    VideoCapture cap(videoName);    Mat frame;    clock_t t1 = clock();    cap.set(CV_CAP_PROP_POS_FRAMES, 1000);    cap >> frame;    clock_t t2 = clock();    cout << "设置起点方式用时:" << t2 - t1 << "ms" << endl;    system("pause");    return 0;}// 输出结果:设置起点方式用时:88ms

可见,方法1用时将随指定帧号的增加线性增加,方法2用时则比较固定,只消耗了单次设置时间。

原创粉丝点击