opencv的鼠標事件主要觸及兩個函數
cvSetMouseCallback
void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param CV_DEFAULT(NULL));
window_name
:鼠標履行的窗口名
on_mouse
:每次指定窗口鼠標事件產生時被調用的函數指針
param
:傳遞到回調函數的參數
on_mouse
的原型void Foo(int event, int x, int y, int flags, void* param);
param
:傳遞到cvSetMouseCallback函數調用的參數
x、y
:鼠標指針在圖象坐標系的坐標
event
: CV_EVENT_*變量之1
enum
{
CV_EVENT_MOUSEMOVE =0,//滑動
CV_EVENT_LBUTTONDOWN =1,//左鍵點擊
CV_EVENT_RBUTTONDOWN =2,//右鍵點擊
CV_EVENT_MBUTTONDOWN =3,//中鍵點擊
CV_EVENT_LBUTTONUP =4,//左鍵放開
CV_EVENT_RBUTTONUP =5,//右鍵放開
CV_EVENT_MBUTTONUP =6,//中鍵放開
CV_EVENT_LBUTTONDBLCLK =7,//左鍵雙擊
CV_EVENT_RBUTTONDBLCLK =8,//右鍵雙擊
CV_EVENT_MBUTTONDBLCLK =9//中鍵雙擊
};
flags
:是CV_EVENT_FLAG的組合
enum
{
CV_EVENT_FLAG_LBUTTON =1,//左鍵拖曳
CV_EVENT_FLAG_RBUTTON =2,//右鍵拖曳
CV_EVENT_FLAG_MBUTTON =4,//中鍵拖曳
CV_EVENT_FLAG_CTRLKEY =8,//按CTRL
CV_EVENT_FLAG_SHIFTKEY =16,//按SHIFT
CV_EVENT_FLAG_ALTKEY =32//按ALT
};
之前用opencv顯示窗口時,習慣直接用imshow( winname, mat);
,少了先命名1個窗口的進程,沒有用到鼠標事件之前并沒出現問題,但,當我開始向代碼里面加鼠標事件后,運行時卻沒有響應
void onMouse(int event, int x, int y, int flags, void* param);
int main()
{
cvSetMouseCallback("ok", onMouse, NULL);
imshow("ok",window_image);
return 0;
}
void onMouse(int event, int x, int y, int flags, void* param)
{
if (event == 2)
{
cout<<"heelo"<<endl;
}
if (event == 1)
{
cout<<"world"<<endl;
}
cout<<x<<" "<<y<<endl;
}
由于缺少窗口聲明,所以上面這段代碼并沒有實現響應,所以需要加1行聲明。
void onMouse(int event, int x, int y, int flags, void* param);
int main()
{
namedWindow("ok", 1);//命名1個窗口
cvSetMouseCallback("ok", onMouse, NULL);
imshow("ok",window_image);
return 0;
}
void onMouse(int event, int x, int y, int flags, void* param)
{
if (event == 2)
{
cout<<"heelo"<<endl;
}
if (event == 1)
{
cout<<"world"<<endl;
}
cout<<x<<" "<<y<<endl;
}