0

我已经写了这段代码

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 是相同的!

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

我应该为同时读取连续帧做一些特别的事情吗?例如,每次我想阅读另一个框架时,使用这条线来到达那个框架:

      input_video.set(CV_CAP_PROP_POS_FRAMES,current_frame+1);

如果是这样,有没有另一种方法不这样做?!

谢谢

4

1 回答 1

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();
       }
于 2013-07-14T04:34:43.183 回答