opencvについてわからないことがあります。
IplImage *frame, *img_gray, *img_out;//画像変数宣言
CvPoint pushpt[10];
int cnum;
CvScalar color[10];
int _tmain(int argc, _TCHAR* argv[])
{
int key=0;
int wait=100;
int newFrame=0;
CvCapture* src; //ビデオキャプチャ宣言
CvVideoWriter* rec; //ビデオライタ宣言
void on_mouse(int event,int x,int y,int flags,void *param);
cvNamedWindow ("入力映像");//表示ウインドウの作成
cvNamedWindow ("出力映像");
src = cvCaptureFromFile("movie.avi");//映像取得
cvSetMouseCallback("入力映像",on_mouse,0);
if(src == NULL){//ファイルが読み込めない場合
printf ("canot open\n");
//cvWaitKey(0);
return -1;
}
cnum=-1;
newFrame=1;
frame = cvQueryFrame(src);//初期フレーム取得
//画像領域の確保
//img_gray = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1);
img_out = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
//ビデオファイル書き込み設定
rec = cvCreateVideoWriter("movie_out.avi",CV_FOURCC('X','V','I','D'),30,cvSize(frame->width, frame->height));
for(int i=0;i<10;i++){//クリックした数だけiを増やして色を変える
color[i]=CV_RGB((int)(255.0/10*(10-i)),(int)(255.0/10*i),0);
}
while(1){//映像が終了するまで繰り返す
if(newFrame){
frame = cvQueryFrame(src);//1フレーム取得
cvCopy (frame,img_out,0);
newFrame=0;
}
if(frame == NULL) break;//映像終了時
//cvLine(frame,cvPoint(50,50),cvPoint(100,100),CV_RGB(255,0,0),2,CV_AA,0);
//draw mark
for(int i=0;i<=cnum;i++){//クリックした数だけ円を描画
cvCircle(img_out,pushpt[i],10,color[i],2,CV_AA,0);
}
cvShowImage ("入力映像", frame);//1フレーム表示
cvShowImage ("出力映像", img_out);
cvWriteFrame(rec ,img_out);//1フレーム書き込み
key=0;
key=cvWaitKey(wait);//key 'n'の入力を待つ
if(key == 'n'){
cnum=-1;
newFrame=1;
}
if(key==27) break;//escキーを押した時終了
}
cvDestroyAllWindows();//すべての表示ウインドウ破棄
cvReleaseCapture(&src);//ビデオキャプチャの解放
cvReleaseVideoWriter(&rec);//ビデオライタの解放
cvReleaseImage(&img_gray);//画像領域の解放
cvReleaseImage(&img_out);
return 0;
}
//追加
void on_mouse(int event,int x,int y,int flags,void *param){
//printf("OnMouseDown\n");
if(event == CV_EVENT_LBUTTONDOWN){
cnum++;
if(cnum>10) cnum=10;//マークの最大点制限
pushpt[cnum] = cvPoint(x,y);
printf("OnMouse:%d\n",cnum);
//cvCircle(frame,pushpt,20,CV_RGB(255,128,0),8,CV_AA,0);
}
}
このソースコードを実行すると、nキーで1フレーム進む動画が2つ表示されます。
1つは読み込んだ動画を表示しています。
もう1つはそれを録画して、動画ファイルとして書き出しています。
読み込んだ動画上にマウスでクリックすると、録画の画面上に丸でマークをします。
ここまではできました。
しかし、ここから次に書くことができません。
1フレーム目でマウスでクリックしてマークをします。
次に、nキーを押して2フレーム目に進みます。(この時1フレームでマークしたものは消えています。)
そして、2フレーム目でマウスでクリックして、マークをすると1フレーム目でマークしたものが一緒に出てくる(できれば色が薄くなって)
ということがしたいです。
pushptという配列に座標がはいっているのは、わかっているのですがどう書けばよいかわかりません。
教えてくださいお願いします。
お礼
ご回答ありがとうございます。 いろいろと試してみましたが,cvVideosWriterのFOURCCの設定がまずかったようです。非圧縮だとうまく保存できました(サイズはすごく大きいですが...) アドバイスありがとうございました。