2

ここの新しいユーザーであり、OpenCV を使用したプログラミングにはかなり慣れていません。

私はVisual Studio 2012を使用しており、指示に従ってすべてのOpenCVモジュールをインストールしましたが、ビデオストリームやフィルターなどをキャプチャするコードの実行に問題はありません.

ここでスタンフォード大学によって作成されたオプティカル フローの例のコードを再現しようとしています: http://robots.stanford.edu/cs223b05/notes/CS%20223-B%20T1%20stavens_opencv_optical_flow.pdf

しかし、cvQueryFrame でアクセス違反エラーが発生しているようです。そのため、この問題をテストするための簡単な関数を作成しました。

   int get_flow(){
    CvCapture *input_video = cvCaptureFromFile("C:\\test.avi");
    cvQueryFrame(input_video);

    while(1){
    if( cvWaitKey( 15 )==32 )  //wait until space key pressed
        {
            break;
        }
    }

    return 0;
}

test.avi が正しい場所にあることを確認しましたが、コード (このコードまたはサンプル コード) が次のように cvQueryFrame コマンドを実行するたびに、次のエラーが発生します。

First-chance exception at 0x75E6A048 (msvcrt.dll) in Win32Project3.exe: 0xC0000005: Access violation reading location 0x011908C0.
Unhandled exception at 0x75E6A048 (msvcrt.dll) in Win32Project3.exe: 0xC0000005: Access violation reading location 0x011908C0.

私の理解では、msvcrt.dll が特定のメモリ ポイントへのアクセスに関してエラーを発行していることを意味しますが、何が問題なのかわかりません。

問題なく cvGrabFrame を単独で使用しましたが、cvGrabFrame と cvRetrieveFrame を一緒に使用したり、cvRetrieveFrame を単独で使用したりすると、msvcrt.dll アクセス エラーがスローされます。

どこでエラーを探すべきか、または問題をまとめて探すべきかがよくわかりません。これに対処するための特定の解決策は見つかりませんでした。何か案は?(PS - VS2012 をデバッグ モードで実行しており、すべての opencv ライブラリが x64 マシン上の x86 で動作しており、chrome も開いています)

ありがとう!

4

1 に答える 1

0

動画ファイルを開けない可能性があります。そのクエリ フレームが失敗したため、次のコードを試して、ビデオ ファイルを本当に開くことができるかどうかを確認してから、その上でクエリ フレームを呼び出すことができます。

int main(int argc, char*argv[])
{

    char *my_file = "C:\\test.avi";
    std::cout<<"Video File "<<my_file<<std::endl;
    cv::VideoCapture input_video;

    if(input_video.open(my_file))
    {
         std::cout<<"Video file open "<<std::endl;
    }
    else
    {
        std::cout<<"Not able to Video file open "<<std::endl;

    }
    namedWindow("My_Win",1);
    namedWindow("Segemented", 1);
    Mat cap_img;
    for(;;)
    {
         input_video >> cap_img;
         imshow("My_Win", cap_img);
          waitKey(0);
    }
   return 0;
 }
于 2013-05-01T16:50:53.593 に答える