五流!!日曜プログラマーのつどい - opencv メモ
[opencv]を使用中に気付いたメモ帳
いつか個別にページを作るけど,まずネタをためます.

シンプルGUI

OpenCVのシンプルGUIについて,ちょっとこみ入ったことについてまとめていく.
[opencv]を使用中に気付いたメモ帳
いつか個別にページを作るけど,まずネタをためます.

マウスイベント取得

opencv ver1.0
まずは基本形
void on_mouse(int event, int x, int y, int flags, void *param=NULL){
 switch( event){
  case CV_EVENT_LBUTTONDOWN:
  {
   /*左クリックをボタンを押したときの処理*/
   break;
  }
  case CV_EVENT_LBUTTONUP:
  {
    /*左クリックが押しあがったときの処理*/
    break;
  }
 }
}

int main(){
 cvNamedWindow( "win1", CV_WINDOW_AUTOSIZE);//"win1"ウィンドウ生成
 cvSetMouseCallback( "win1", on_mouse);//"win1"にon_mouseを登録.

 cvShowImage( "win1", img);

 return 0;
}

任意のポインタ渡し

指定したウインドウ内でマウスイベントが発生するたびに呼び出す関数を登録する.
	void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param=NULL );
登録するマウスイベント関数(例
	void on_mouse(int event, int x, int y, int flags, void* param);
変数
int eventマウスアクション の値 CV_EVENT_*
int xx座標
int yy座標
int flags状態フラグ CV_EVENT_FLAG_* の論理和をとる
void* param任意のポインタ
cvSetMouseCallbackの"void* param"は"void*"の汎用ポインタによりプログラマの好きなポインタを渡すことができる.
例えば画像のポインタをマウスイベント関数に渡したいとき,次のようにすればイベント関数にポインタが渡すことができる.

void on_mouse( int event, int x, int y, int flags, void *param=NULL){
	if(pram != NULL)
		IplImage* img = (IplImage*)param;//キャストして元の型に戻す
}
int main(){
//   前略
	IplImage *srcImage = cvLoadImage("hoge.jpg");
	cvSetMouseCallback( "window", on_mouse, srcImage);
//   以下略
}
これで任意のポインタを渡すことができる(ただしキャストして元の型に戻す必要がある).
ここで例えば構造体を渡すことを考えると複数の値を受け渡すことも可能になる.

EVENTとFLAGの設定

int 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中 同上

以下自分で試してない
int flag の値フラグが立つ条件(論理和で同士押しを察知)
CV_EVENT_FLAG_LBUTTON左クリックを押す (CTRL, SHIFT, ALT を押さずに)
CV_EVENT_FLAG_RBUTTON右クリックを押す ( 同上 )
CV_EVENT_FLAG_MBUTTON中クリックを押す ( 同上 )
CV_EVENT_FLAG_CTRLKEYCTRLを押して,ボタンの離したときと離した直後
CV_EVENT_FLAG_SHIFTKEYSHIFTを押して,ボタンの離したときと離した直後
CV_EVENT_FLAG_ALTKEYALTを押して,ボタンの離したときと離した直後