3

Android デバイス (この場合はエミュレーター) の SD カードに保存されているビデオからフレームごとにキャプチャする必要があります。NDK 経由で Android と OpenCV を使用しています。DDBS (Eclipse) のファイル エクスプローラーを使用して、sdcard 内のファイル "SinglePerson.avi" を手動でプッシュし、以下のコードを使用してファイルを読み取りました。

    JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4Mixed_VideoProcessing(JNIEnv*, jobject)
{
    LOGI("INSIDE VideoProcessing ");

    CvCapture* capture = cvCaptureFromAVI("/mnt/sdcard/SinglePerson.avi");

    IplImage* img = 0;

    if(!cvGrabFrame(capture)){              // capture a frame
        LOGI("Inside the if");
        printf("Could not grab a frame\n\7");
        exit(0);
    }
    img=cvRetrieveFrame(capture);// retrieve the captured frame
    cvReleaseCapture(&capture);

}

問題は、cvGrabFrame(capture) の結果が常に false になることです。ビデオを正しく開いてフレームを取得するための提案はありますか? 前もって感謝します

4

2 に答える 2

0

OpenCV の一部のバージョン (opencv2 パッケージ内) は、ビデオ サポートなしでビルドされます。あなたの場合は、pkg の Makefile で「-D WITH_FFMPEG=ON」を有効にして再コンパイルする必要があります。

「OpenCV を使用して AVI ビデオを表示する」チュートリアルを見てください。

「さまざまな形式でのビデオのエンコードとビデオのデコードを可能にするために、ffmpeg が正常にインストールされていることを確認する必要がある場合があります。ffmpeg 機能がない場合、この単純な例を実行しようとすると問題が発生し、コンパイル エラーが発生する可能性があります」.

cvCaptureFromAVI のパスも確認してください。

これが役立つことを願っています!

于 2013-01-24T12:34:33.997 に答える
0

あなたが観察している動作は、おそらくcvCaptureFromAVI()失敗によるものです。安全にコーディングを開始し、呼び出しの戻り値を確認する必要があります。

CvCapture* capture = cvCaptureFromAVI("/mnt/sdcard/SinglePerson.avi");
if (!capture)
{
    printf("!!! Failed to open video\n\7");
    exit(0);
}

この関数は通常、次の 2 つの理由で失敗します。

  • ファイルにアクセスできない場合 (ファイルシステムのパーミッションが間違っているため);
  • システムにコーデックがありません (またはビデオ形式が OpenCV でサポートされていません)。

OpenCV を初めて使用する場合は、最初にデスクトップ (PC) で OpenCV コードをテストすることをお勧めします。

于 2013-01-24T15:52:50.863 に答える