OpenCV用setMouseCallback()函式處理滑鼠事件,能夠偵測使用者滑鼠的行為,並呼叫我們寫的函式來做相關的處理,使用setMouseCallback()時要一個函式名當參數,且這個函式要有一定的引數格式(int event, int x, int y, int flags, void* param),名稱則可以自己定義。
void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata=0)
winname:滑桿的視窗名稱。onMouse:自定義函式的名稱,當發生滑鼠事件時,會呼叫此函式。userdata:選擇性要傳給onMouse自定義函式的參數。我們透過自定義的函式onMouse(),來得到滑鼠事件的資訊。
void onMouse(int event, int x, int y, int flags, void* param)
event:事件代號,代表滑鼠的動作。x:事件發生的x座標。y:事件發生的y座標。flags:旗標代號,代表拖曳事件。param:事件代號名稱,自己定義的事件ID。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:中鍵雙擊flags有以下幾種:
CV_EVENT_FLAG_LBUTTON:左鍵拖曳CV_EVENT_FLAG_RBUTTON:右鍵拖曳CV_EVENT_FLAG_MBUTTON:中鍵拖曳CV_EVENT_FLAG_CTRLKEY:Ctrl不放事件CV_EVENT_FLAG_SHIFTKEY:Shift不放事件CV_EVENT_FLAG_ALTKEY:Alt不放事件以下程式碼示範setMouseCallback()的使用,先在視窗內秀出影像,當使用者在影像上拖曳矩形,此時在滑鼠點擊拖曳的地方,會畫出藍色邊框的矩形:
#include <cstdio> #include <opencv2/opencv.hpp> using namespace cv; void onMouse(int Event,int x,int y,int flags,void* param); Point VertexLeftTop(-1,-1); Point VertexRightDown(-1,-1); int main(){ Mat src = imread("lena.jpg",CV_LOAD_IMAGE_UNCHANGED); namedWindow("image",0); setMouseCallback("image",onMouse,NULL); while(true){ if(VertexLeftTop.x==-1 && VertexRightDown.x==-1){ imshow("image", src); } if(VertexLeftTop.x!=-1 && VertexRightDown.x!=-1){ rectangle(src, Rect(VertexLeftTop,VertexRightDown),Scalar(255,0,0),2); VertexLeftTop.x = -1; VertexLeftTop.y = -1; VertexRightDown.x = -1; VertexRightDown.y = -1; imshow("image", src); } if(cvWaitKey(33)==27){ break; } } return 0; } void onMouse(int Event,int x,int y,int flags,void* param){ if(Event==CV_EVENT_LBUTTONDOWN){ VertexLeftTop.x = x; VertexLeftTop.y = y; } if(Event==CV_EVENT_LBUTTONUP){ VertexRightDown.x = x; VertexRightDown.y = y; } }
转自:http://monkeycoding.com/?p=653
