AND OR  

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
   新しい位置.
  • 出力結果
    trackbar.jpg

マウスイベントを取得する

マウスイベントに対するコールバックを指定する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を参照