プロが教える店舗&オフィスのセキュリティ対策術

現在、OpenCVを用いてハイビジョンのaviファイル(1440*1080)の画像処理を行うプログラミングを行っています。

aviファイルの読み込み・表示はOpenCVでは一般的な方法であるcvCaptureFromAVIとcvQueryFrameを用いて行っています。

この処理において最初の方はうまく処理が行えるのですが、処理が進むとファイルがまだ終わっていないのにも関わらず、cvQueryFrameでフレームが取得できず、処理が終了してしまいます。

ファイルが終了してしまうフレーム数も大体決まっており、mencoderで変換したファイルは約460フレーム目で、Adobe Media Encoderで変換したファイルは約910フレーム目でファイルが終了してしまいます。

メディアプレーヤーでaviファイルそのものを再生してみたところ、460フレーム目・910フレーム目以降のフレームも存在していることが確認されたので、本当にファイルが終了しているというわけではありません。

このままだと約30秒以上の動画は扱えず、非常に困っています。
確認として以下のプログラムで1000フレーム目から読み込むようにしてみたのですが、やはりすぐにファイルが終わってしまいます。

試しにハイビジョンでないaviファイル(640*480)で処理してみたところ正常に動作したのでエンコーダーの問題かプログラムの問題ではないかと思うのですが、何か少しでもお分かりの方がいらっしゃればご指導よろしくお願い致します。

<aviファイル読み込みプログラム>
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

char input_name[] = "hogehoge.avi";

int main(int argc, char** argv)
{
int key, i = 0;
CvCapture* capture = NULL;
IplImage* img = NULL;
char* captureWindow = "Capture";
double prop;

if(NULL==(capture = cvCaptureFromAVI(input_name))){
printf("指定のaviファイルが見つかりませんでした.\n");
return -1;
}

cvNamedWindow(captureWindow, CV_WINDOW_AUTOSIZE);
prop = 1000.0f;
      cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, prop);

for(;;)
{
if(NULL==(img=cvQueryFrame(capture))){
printf("movieファイルが終わりました。\n");
break;
}

cvShowImage(captureWindow, img);
printf("No.%dframe\n", i);
i++;

key = cvWaitKey(1);
if (key == 0x1b)
{
break;
}
}

cvReleaseCapture(&capture);
cvReleaseImage(&img);
cvDestroyWindow(captureWindow);

return 0;
}

A 回答 (1件)

メモリリークは発生していませんか?

この回答への補足

ご指摘ありがとうございます。

素人観点からで申し訳ないのですが、メモリーリークしている場合でもファイルが終了する部分から読み込めば実行できるのではないでしょうか(今回で言えば460フレーム目で終わるとするなら461フレーム目から読み込む)?実際に460フレーム目までは読み込めていますし。

メモリーリークのチェックはしてみます。

補足日時:2009/11/09 22:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!