用 OpenCV 来读取视频,经常需要从指定帧序号的片断开始读取,这个时候,就需要用 cvSetCaptureProperty 结合参数 CV_CAP_PROP_POS_FRAMES 来设定,例子代码如下:

bool PickSomeFrames(const char* filename, int start, int end, char* savePath)
{
    CvCapture* capture = cvCaptureFromAVI(filename);  //读取视频文件

    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, start);

    int count = start;
    while( cvGrabFrame(capture) && count <= end )
    {
        IplImage* pFrame = cvRetrieveFrame(capture);// 获取当前帧

        char test[100];
        sprintf(test,"%s\\%d%s",savePath,count,".jpg");
        cvSaveImage(test,pFrame);

        count++;
    }

    cvReleaseCapture(&capture);

    return false;
}

以上这种方法,支持用多线程的方式,来同时读写视频不同帧序号开始的片断。以上这些代码,在采用多线程来加速视频处理时,特别有用。