OPENCV无法同时读取2个视频帧

时间:2013-07-13 05:58:59

标签: opencv image-processing computer-vision

我写过这段代码

while (true)
{
    cv::Mat frame1,frame2,dst,temp;
    if (!input_video.read(frame1))
    {
        fprintf(stderr, "Video has Finished .\n");
        getchar();
        return -1;
    }
    if (!input_video.read(frame2))
    {
        fprintf(stderr, "Video has Finished .\n");
        getchar();
        return -1;
    }
    cv::cvtColor(frame1,frame1,CV_RGB2GRAY) ;
    cv::cvtColor(frame2,frame2,CV_RGB2GRAY) ;
    cv::subtract(frame2,frame1,dst);
    cv::imshow("F1",frame1);
    cv::imshow("F2",frame2);
    cv::imshow("dst",dst);
    cv::waitKey();
       }

当我正在阅读视频时(不是来自相机而是来自我的硬盘的视频)frame1,frame2是相同的!!!

我不知道为什么“read”方法为frame2返回相同的帧?所以减去的图像总是空白的图片!!!

我应该做些什么特别是同时阅读连续帧吗? 例如,每当我想要读取另一帧时,使用此行来到达该帧:

      input_video.set(CV_CAP_PROP_POS_FRAMES,current_frame+1);

如果是这样,还有另一种方式不这样做吗?!

由于

1 个答案:

答案 0 :(得分:1)

每次调用函数input_video.read()时都不会创建新对象,并返回内部缓冲区cv::VideoCapture的指针。对于这种情况,如果您将第一帧复制到cv::Mat对象,问题就解决了:

while (true)
{
    cv::Mat frame,frame1,frame2,dst,temp;
    if (!input_video.read(frame))
    {
        fprintf(stderr, "Video has Finished .\n");
        getchar();
        return -1;
    }
    frame.assignTo(frame1);
    if (!input_video.read(frame))
    {
        fprintf(stderr, "Video has Finished .\n");
        getchar();
        return -1;
    }
    frame.assignTo(frame2);
    cv::cvtColor(frame1,frame1,CV_RGB2GRAY) ;
    cv::cvtColor(frame2,frame2,CV_RGB2GRAY) ;
    cv::subtract(frame2,frame1,dst);
    cv::imshow("F1",frame1);
    cv::imshow("F2",frame2);
    cv::imshow("dst",dst);
    cv::waitKey();
       }