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