OpenCVでのcvCreateVideoWriterがうまくいきません
今回複数枚のbmp画像群を、その画像につけられた4桁の連番の順に順次AVIファイルのフレームとして格納して行き、最終的にひとつのAVIファイルを出力するというプログラムを書いていますが、OpenCVの関数である「cvCreateVideoWriter」で躓いています。
CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );
という仕様で、第二引数に「-1」と入れることで、プログラム実行時ffmpegが自動的にどの動画像コーデックを使用するかを聞いてくるということだったのですが、そうしているにも関わらずコーデック選択画面は出ないどころか、出力された動画(avi)も再生できない破損したファイルとして出力されてしまいます。
何かコーデックをインストールする必要があるのか(動画のコーデックとして、Combined Community Codec Packをインストール済みです)、それともプログラム内にまずい箇所があるのか、わからなくてあせっています。どなたかわかる方いらっしゃいましたらご教授よろしくお願いいたします。
ソース↓↓
//---------------------------------------------------------
// bmp→aviコンバート
//---------------------------------------------------------
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <iostream>
using namespace std;
#include <fstream>
int main(int argc, char** argv)
{
//変数定義-----------------------------------------------
int key=NULL;
IplImage* img = NULL; //読み込んだ画像ファイル用
char* outputWindow = "Output"; //進行状況確認用ウィンドウ
CvVideoWriter* VideoWriter = NULL; //ビデオライタ
char* filename = "test.avi"; //出力ファイル名
double fps = 30; //ビデオのフレームレート
int i=0; //画像の連番カウント用
char ImageName[104]; //読み込む画像ファイル名
char NameTmp[100]; //上の連番なし
//--------------------------------------------------------
//元画像の読み込み&フレームへの埋込み----------------------------------------------
cout << "画像名を入力してください(4桁連番号省略)" << endl;
cin >> NameTmp;
sprintf(ImageName,"%s0000.bmp",NameTmp);
img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE);
//画像一枚目の読み込みの
if(img==NULL){
cout << ImageName << "の読み込み失敗" <<endl;
return 1;
}
//進行状況確認用ウィンドウ展開
cvNamedWindow(outputWindow, CV_WINDOW_AUTOSIZE);
//ログファイル展開
std::ofstream ofs;
ofs.open( "test.txt" );
ofs << "1枚目の画像展開成功" << std::endl;
//ビデオライタ展開
VideoWriter = cvCreateVideoWriter(filename, -1, fps, cvGetSize(img), 0);
ofs << "ビデオライタ展開" << std::endl;
while(img!=NULL){
//画像ファイルの連番に合わせて読み込むファイル名を変更
if(i<10){
sprintf(ImageName,"%s000%d.bmp",NameTmp,i);
}
else if(i<100){
sprintf(ImageName,"%s00%d.bmp",NameTmp,i);
}
else if(i<1000){
sprintf(ImageName,"%s0%d.bmp",NameTmp,i);
}
else{
sprintf(ImageName,"%s%d.bmp",NameTmp,i);
}
//進境状況をウィンドウに出力
cvShowImage(outputWindow, img);
//進行状況確認用。10ms待つ
key = cvWaitKey(10);
//ビデオ書き込み
cvWriteFrame(VideoWriter,img);
cout << ImageName << endl;
i+=1;
img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE); //次のフレーム画像の読み込み
ofs << i << "枚目の画像書き込み成功" << std::endl;
}
//ビデオ書き込み用メモリを開放
cvReleaseVideoWriter(&VideoWriter);
//ログファイルを閉じる
ofs.close();
//進行状況確認ウィンドウを閉じる
cvDestroyWindow(outputWindow);
return 0;
}
お礼
ご回答ありがとうございました。 目的の動作をいたしました。