こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

【OpenCV】ハイビジョンaviファイル読み込み途中にファイルが終了してしまう問題

現在、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;
}

投稿日時 - 2009-11-07 17:09:35

QNo.5429102

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

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

投稿日時 - 2009-11-09 12:02:47

補足

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

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

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

投稿日時 - 2009-11-09 22:29:42

あなたにオススメの質問