ビデオのwhile(1){ }の繰り返しがあるコードを書くときの注意点

OpenCVのサンプルでcvLoadImageを使って画像イメージを1度だけ呼び込んで処理するコードを動画にする場合の注意点を説明する。
 ビデオのように連続して画像を呼び込む場合はwhile内の繰り返しの処理に注意する必要がある。
基本的に、while内で使う変数やウィンドウの表示、メモリ領域を確保するcreate,clone,load関係の関数はwhileの前に書く。前準備といえる(一度だけの処理)。
一方、while内は実際の処理でこの時点でメモリの確保などは基本的にはしないようにする。
while内は繰り返しだ。1度だけの処理とは違います。

while内に必要な関数は、以下の3つが最低限必要だろう。
1、cvQueryFrame 随時IplImageの作成         src_img = cvQueryFrame (capture);
2、cvShowImage 確認のためのイメージの再描画    cvShowImage ("ウインドウタイトル名", src_img);
3、cvWaitKey ブレイクのために使う         int key = cvWaitKey (10); if (key >= 0) { break; }
これらは必ず使うはず。
cvQueryFrame関数を使うにはwhile句の前にcvCreateCameraCaptureがいる。
CvCapture *capture;と宣言しておいて
capture = cvCreateCameraCapture(0);
このcapture変数を使ってIplImageを作る。

静止画でIplImage *img;を作るようになっていると思うが、さらに作る場合は、img = cvCreateImage(cvGetSize(dst_img1), IPL_DEPTH_8U, 1);カラーなら1を3に
繰り返しの中でcreate系の代わりによく使う関数がある。
画像を2値化や画像サイズや画素の変更、画像のコピーなどだ。
画像のコピーは、cvCopy(img1, img2); img1もimg2もメモリ上に存在し、同じサイズ。
グレースケールへ変更は、cvCvtColor(img1, img_gray, CV_BGR2GRAY); img1もimg_grayもメモリ上に存在し、それぞれ適切なサイズ。
この2つの関数は、mallocのように新たにメモリを確保するようなことはない。
 cvReleaseCapture(&capture); //終了後に固まるのはこれがないことが多い


まとめるとこんなかんじ

while(1)の前
CvCapture *capture;
capture = cvCreateCameraCapture(0);
cvNameWindowもこちらに移動

while(1)ブロック内
src_img = cvQueryFrame (capture);
cvShowImage ("ウインドウタイトル名", src_img);
int key = cvWaitKey (10); if (key >= 0) { break; }

while(1)ブロック後
cvReleaseCapture(&capture); //終了後に固まるのはこれがないことが多い

その他
画像のコピーは、cvCopy(img1, img2);
グレースケールへ変更は、cvCvtColor(img1, img_gray, CV_BGR2GRAY);

貼付け用

CvCapture *capture;
capture = cvCreateCameraCapture(0);
src_img = cvQueryFrame (capture);
int key = cvWaitKey (10); if (key >= 0) { break; }
cvReleaseCapture(&capture); //終了後に固まるのはこれがないことが多い
cvCopy(img1, img2);
cvCvtColor(img1, img_gray, CV_BGR2GRAY);
cvFlip(img);//上下反転
printf("%d\n",__LINE__);

「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -
名前:
コメント:
最終更新:2010年02月05日 15:29
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。