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は同じです!!!

「read」メソッドが 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 に答える