1

最近、ここStackoverflowで、結果を改善するためにOpenCV 2.3.1にアップグレードすることをお勧めしましたcvVideoWriter(ビデオの最後のフレームは読み取り/書き込みのどちらもありませんでした)。実際、v.2.3.1では読み取りは問題ありませんが、書き込みはまだソートされています問題の。それにもかかわらず、私はこの問題を修正しましたが、別の問題に対処できませんでした: VideoWriter 関数を使用すると、私のプログラムは常にクラッシュします。原因を確認したところ、新しいバージョンの highgui (2.3.1) であることが判明しました。これは、代わりに highgui210 を使用するとクラッシュが発生しないためです (ただし、もちろん最後のフレームの問題)。この問題とその解決方法を知っている人はいますか? ところで、それが重要かどうかはわかりません。次のページの指示に従って、システムに OpenCV 2.3.1 をインストールしました (VS 9 Express を使用しています)。

http://www.arunkumarr.co.in/site/index.php/articles/10-configuring-opencv-23-in-visual-studio-2008

乾杯ステファン

4

2 に答える 2

1

私が要求したように、あなたのコードは最小限の例ではありません。それは不完全で、恐ろしく識別されており、コンパイルされていないため、何が問題なのかを判断することは不可能です。

最新の OpenCV バージョンでクラッシュするという事実は、必ずしも OpenCV に問題があることを意味するわけではありません。以前のバージョンでは実質的に何もしていなかった関数で、最終的に適切な実装を行った可能性があります。

あなたが取るべき最も適切な行動は、あなたが興味を持っているコアタスクを実行する最小限のアプリケーションを書くことです.コードを読むと、それは次のようになります:

  • カメラからフレームを読み取ります。

  • ビデオ ライターを開いて、カメラからのフレームをディスクに記録します。

この2つのタスクだけ、とても簡単です!CreateAvi()CloseAvi()remove()、および OpenCV に属さないその他の機能はすべて忘れてください。

この単純なアプリケーションは、OpenCV が機能することを示します。また、問題の原因はおそらく、この単純なアプリケーションから削除されたコードに存在する別の何かであることを示します。

この問題は OpenCV にあるのではなく、あなたが書いたコードが原因です。

編集

こんにちは、ドイツ人です。あなたの質問に攻撃されたり、OpenCV を開発したりしているわけではありません。さて、以下のアプリケーションは、最初から行うべきことを実行します。これは、OpenCV を使用してビデオ ファイルを読み取り、フレームをウィンドウに表示してから、フレームをディスク上の新しいファイルに書き込む最小限の例です。それは簡単で、機能し、私が伝えようとしてきたことを示しています。あなたが観察した問題は、OpenCV 2.3.1 のバグが原因ではありません。楽しみ:

#include <cv.h>
#include <highgui.h>

int main()
{   
    CvCapture* capture = cvCreateFileCapture("green_lantern_sample.avi");
    if (!capture)
    {
        printf("!!! cvCreateFileCapture failed\n");
        return -1; 
    }

    int frame_count = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
    int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
    int video_w = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
    int video_h = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
    printf("* %d x %d\n", video_w, video_h);

    CvVideoWriter* writer = cvCreateVideoWriter("out.avi", 
                                                CV_FOURCC('X','V','I','D'), 
                                                fps, 
                                                cvSize(video_w, video_h), 
                                                1);
    if (!writer)
    {
        printf("!!! cvCreateVideoWriter failed\n");
        return -1; 
    }

    cvNamedWindow("video");
    IplImage* frame = NULL;
    while (true)
    {        
        frame = cvQueryFrame(capture);
        if(!frame)
            break;

        cvWriteFrame(writer,frame);                 

        cvShowImage("video", frame);
        cvWaitKey(1);        
    }

    cvReleaseVideoWriter(&writer);
    cvReleaseCapture(&capture);
    cvDestroyWindow("video");

    return 0;
}

OpenCV 2.3.1 でテスト済み: VS 9 Express (Windows XP 32 ビット) および Fedora Linux (同じく 32 ビット)。

于 2012-04-18T17:06:27.710 に答える
0

現在、利用可能な最新の OpenCV は 2.4 beta 2 です。試してみて、問題が引き続き発生するかどうかを確認してください。

しかし、問題は間違った構成によって引き起こされることもあります - すべてのパス (ENV 変数、Visual Studio 構成、bin ファイル、lib ファイル、およびインクルード ディレクトリが正しい OpenCV バージョンを指していること) を確認してください。

于 2012-04-18T09:51:31.503 に答える