OpenCVでは簡易GUIを扱えます.
ただ,JavaのSwing等と比べてかなり貧弱なので高度な操作はできません.
ウィンドウを生成・破棄する
ウィンドウを生成するには''cvNamedWindow()'',破棄するには''cvDestroyWindow()''を使います.
int cvNamedWindow(const char* name, int flags=CV_WINDOW_AUTOSIZE); name ウィンドウの識別に用いられるウィンドウ名で,ウィンドウのタイトルバ ーに表示される. flags ウィンドウのフラグ.CV_WINDOW_AUTOSIZEのみ.
void cvDestroyWindow(const char* name); name 破棄するウィンドウの名前.
また,生成したウィンドウを一度で全て破棄するには''cvDestroyAllWindows()''を使うと便利です.
void cvDestroyAllWindows(void);
ウィンドウ内に画像を表示する
cvNamedWindow()で生成したウィンドウ内に画像を表示するには''cvShowImage()''を使います.
void cvShowImage(const char* name, const CvArr* image); name ウィンドウの名前. image 表示される画像.
キーイベントを取得する
''cvWaitKey()''を使います.
int cvWaitKey(int delay=0); delay 遅延時間(ミリ秒).
delayが0以下だとキーが押されるまで待機します.
変数に代入するとキーコードを取得できます.
トラックバーを操作する
- トラックバーを生成するには''cvCreateTrackbar()''を使います.
int cvCreateTrackbar(const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change); trackbar_name 作成されるトラックバーの名前. window_name 作成されるトラックバーの親として用いられるウィンドウの名前. value スライダの位置を表す,整数型変数のポインタ.作成時のスライダ位置は,この変数によって定義される. count スライダの最大値.最小値は常に0. on_change スライダの位置が変更されるたびに呼び出される関数のポインタ.
- トラックバーの位置を取得するには''cvGetTrackbarPos()''を使います.
int cvGetTrackbarPos(const char* trackbar_name, const char* window_name); trackbar_name トラックバーの名前. window_name トラックバーの親ウィンドウの名前.
- トラックバーの位置を設定するには''cvSetTrackbarPos()''を使います.
void cvSetTrackbarPos(const char* trackbar_name, const char* window_name, int pos); trackbar_name トラックバーの名前. window_name トラックバーの親ウィンドウの名前. pos 新しい位置.
- 出力結果
マウスイベントを取得する
マウスイベントに対するコールバックを指定する''cvSetMouseCallback()''を使います.
void cvSetMouseCallback(const char* window_name, CvMouseCallback on_mouse, void* param=NULL); window_name ウィンドウの名前. on_mouse 指定されたウィンドウ内でマウスイベントが発生するたびに呼ばれる関数のポインタ. この関数のプロトタイプは, void Foo(int event, int x, int y, int flags, void* param); となる. eventは CV_EVENT_* のいずれか. xとyは画像座標系内でのマウスポインタの座標, flagsはCV_EVENT_FLAGの論理和. paramはユーザによって定義されるパラメータ. param コールバック関数に渡されるパラメータで,ユーザによって定義される.
- eventの種類
CV_EVENT_MOUSEMOVE
CV_EVENT_LBUTTONDOWN
CV_EVENT_RBUTTONDOWN
CV_EVENT_MBUTTONDOWN
CV_EVENT_LBUTTONUP
CV_EVENT_RBUTTONUP
CV_EVENT_MBUTTONUP
CV_EVENT_LBUTTONDBLCLK
CV_EVENT_RBUTTONDBLCLK
CV_EVENT_MBUTTONDBLCLK
CV_EVENT_FLAG_LBUTTON
CV_EVENT_FLAG_RBUTTON
CV_EVENT_FLAG_MBUTTON
CV_EVENT_FLAG_CTRLKEY
CV_EVENT_FLAG_SHIFTKEY
CV_EVENT_FLAG_ALTKEY
コールバック関数にはIplImageをparamとして渡すことが多くなると思います.
paramはvoid型のポインタなので,
のようにキャストする必要があります.C++の場合はstatic_cast<IplImage*>(param)で.
カメラから画像をキャプチャする
カメラからのビデオキャプチャを初期化するには''cvCreateCameraCapture()''を使います.
CvCapture* cvCreateCameraCapture(int index); index 使われるカメラのインデックス.
カメラやファイルから一つのフレームを取り出すには''cvQueryFrame()''を使います.
IplImage* cvQueryFrame(CvCapture* capture); capture ビデオキャプチャ構造体.
CvCapture 構造体を解放するには''cvReleaseCapture()''を使います.
void cvReleaseCapture(CvCapture** capture); capture ビデオキャプチャ構造体へのポインタ.
ビデオファイルの入出力
ビデオファイルの入出力を行うには,まずビデオ書き込み用の構造体(''CvVideoWriter'')を用意する必要があります.
ファイルからのビデオキャプチャを初期化する(入力)には''cvCreateFileCapture()''を使います.
CvCapture* cvCreateFileCapture(const char* filename); filename ビデオファイル名.
ここで,cvCreateFileCapture()はhighgui.h内で次のように定義されているので,''cvCaptureFromFile()''や''cvCaptureFromAVI()''でも同じ動作をします.
#define cvCaptureFromFile cvCreateFileCapture #define cvCaptureFromAVI cvCaptureFromFile
フレームをビデオファイル書き込む(出力)には''cvCreateVideoWriter()'',''cvWriteFrame()''を使います.
typedef struct CvVideoWriter CvVideoWriter; CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1); filename 出力するビデオファイルの名前. fourcc フレームを圧縮するためのコーデックを表す4文字.例えば,CV_FOURCC('P','I','M','1')はMPEG-1コーデック, CV_FOURCC('M','J','P','G')はmotion-jpegコーデックである. また,以下のような二つの特殊な値を引数とすることもできる: CV_FOURCC_PROMPT - ユーザが圧縮手法とパラメータを選択できるようにダイアログを開く(Win32 のみ). CV_FOURCC_DEFAULT - 与えられたファイル拡張子に対するデフォルトの圧縮手法を利用する(Linux のみ). fps 作成されたビデオストリームのフレームレート. frame_size ビデオフレームのサイズ. is_color 0でない場合は,エンコーダはカラーフレームとしてエンコードする. そうでない場合は,グレースケールフレームとして動作する(現在,このフラグはWindowsでのみ利用可能).
対応するコーデックが環境にインストールされている必要があります.HighGUIモジュールはWindowsではVFW(Video for Windows),MacOS XではQuickTime,Linuxではffmpegを使います.また,MacOS Xではファイル名をフルパスで指定するか,touchコマンドなどであらかじめファイルを作っておく必要があるようです.
int cvWriteFrame(CvVideoWriter* writer, const IplImage* image); writer CvVideoWriter構造体. image 書き込まれるフレーム.
CvVideoWriter構造体を解放するには''cvReleaseVideoWriter()''を使います.
void cvReleaseVideoWriter(CvVideoWriter** writer); writer ビデオライタ構造体へのポインタ.
- 入力された動画像を二値化してファイル出力する.
cvQueryFrame()は映像が終わりになればnullを返します.また,キャプチャされた画像のメモリの確保と解放はビデオキャプチャ関数によって行われるので,cvReleaseImage()を用いてユーザ側で解放しようとすると2重で解放されることになるのでエラーが発生してしまいます.
ここで,CV_FOURCCマクロの引数とコーデックの表を以下に載せます(これで全てではありません).
CV_FOURCC('P','I','M','1') | MPEG-1 |
CV_FOURCC('M','P','G','4') | MPEG-4 |
CV_FOURCC('M','P','4','2') | MPEG-4.2 |
CV_FOURCC('D','I','V','X') | DivX |
CV_FOURCC('D','X','5','0') | DivX ver 5.0 |
CV_FOURCC('X','V','I','D') | Xvid |
CV_FOURCC('U','2','6','3') | H.263 |
CV_FOURCC('H','2','6','4') | H.264 |
CV_FOURCC('F','L','V','1') | FLV1 |
CV_FOURCC('M','J','P','G') | Motion JPEG |
0 | 非圧縮 |
0を指定すると非圧縮AVIが出力されてますが,ファイルサイズが非常に大きくなるので注意.
また,FourCCについてはwww.FOURCC.org - Video Codecs and Pixel Formatsを参照