opencv 滑鼠操作 setMouseCallback
版權宣告:本文為博主原創文章,未經博主允許不得轉載。
網上有很多關於setMouseCallback的引數列表和使用方法,但是都是藉助全域性變數來使用的。並且有人說函式形參沒有用。這裡使用了opencv的兩個引數來實現函式形參的資料傳遞。
OpenCV中的滑鼠響應的函式是setMouseCallback(),可以實現畫圖的功能。
c++: void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
void on_Mouse(int event, int x, int y, int flags, void* param);
- winname:視窗的名字
- onMouse:滑鼠響應函式,回撥函式。指定窗口裡每次滑鼠時間發生的時候,被呼叫的函式指標。 這個函式的原型應該為void on_Mouse(int event, int x, int y, int flags, void* param);
- userdate:傳給回撥函式的引數
- event是 CV_EVENT_*變數之一
- x和y是滑鼠指標在影象座標系的座標(不是視窗座標系)
- flags是CV_EVENT_FLAG的組合,
- param是使用者定義的傳遞到setMouseCallback函式呼叫的引數。
我的理解是param和userdata是相互賦值的,是溝通setMousecallback和on_Mouse的橋樑,不過需要注意的是,這個橋樑是一個viod型別的指標,所以在on_Mouse中需要強制型別轉換一下。下面是我使用它傳遞字串的一個例子。
#include<opencv.hpp>
#include<iostream> using namespace std;
using namespace cv; void leftClick(int event, int x, int y, int flag, void* param)
{
if (event != EVENT_LBUTTONDOWN)
{
return;
} string * ptr =(string *) param;
cout << *ptr;
*ptr = "textFromCallback";
} int main()
{
string p_click ="textFromMain";//最好加static, 避免有時資料賦值後被釋放
cout << p_click;
//讀取圖片
const char* imagename = "C:/Capture001.png";
Mat img = cv::imread(imagename);
if (img.empty())
{
fprintf(stderr,"Can not load image %s\n",imagename);
}
if (!img.data)
//顯示視窗
namedWindow("image");//不能省略,否則setMouseCallback不執行
imshow("image",img);
waitKey(30);
setMouseCallback("image", leftClick, &p_click);
waitKey(); }
附event:
#defineCV_EVENT_MOUSEMOVE 0
#defineCV_EVENT_LBUTTONDOWN 1
#defineCV_EVENT_RBUTTONDOWN 2
#defineCV_EVENT_MBUTTONDOWN 3
#defineCV_EVENT_LBUTTONUP 4
#defineCV_EVENT_RBUTTONUP 5
#defineCV_EVENT_MBUTTONUP 6
#defineCV_EVENT_LBUTTONDBLCLK 7
#defineCV_EVENT_RBUTTONDBLCLK 8
#defineCV_EVENT_MBUTTONDBLCLK 9
#defineCV_EVENT_FLAG_LBUTTON 1
#defineCV_EVENT_FLAG_RBUTTON 2
#defineCV_EVENT_FLAG_MBUTTON 4
#defineCV_EVENT_FLAG_CTRLKEY 8
#defineCV_EVENT_FLAG_SHIFTKEY 16
#defineCV_EVENT_FLAG_ALTKEY 32