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 x | x座標 |
int y | y座標 |
int flags | 状態フラグ CV_EVENT_FLAG_* の論理和をとる |
void* param | 任意のポインタ |
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); // 以下略 }これで任意のポインタを渡すことができる(ただしキャストして元の型に戻す必要がある).
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_CTRLKEY | CTRLを押して,ボタンの離したときと離した直後 |
CV_EVENT_FLAG_SHIFTKEY | SHIFTを押して,ボタンの離したときと離した直後 |
CV_EVENT_FLAG_ALTKEY | ALTを押して,ボタンの離したときと離した直後 |