生活随笔
收集整理的這篇文章主要介紹了
鼠标的几种响应
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
opencv2鼠標響應操作的函數,下面分別介紹一下:
? ? 1.1 回調函數
? ? ? opencv2.4.5中,提供的鼠標回調函數是 setMouseCallback,函數聲明如下:
[cpp]?view plaincopy
CV_EXPORTS?void?setMouseCallback(const?string&?winname,?MouseCallback?onMouse,?void*?userdata?=?0);??
? ? ?函數參數介紹
? ? ? ? ? ? const string& winname,windows視窗名稱,對名為winname的視窗進行鼠標監控。
? ? ? ? ? ??MouseCallback onMouse,鼠標響應處理函數,監聽鼠標的點擊,移動,松開,判斷鼠標的操作類型,并進行響應的函數處理。
? ? ? ? ? ??void* userdata = 0 鼠標響應處理函數的ID,與鼠標相應處理函數相匹配就行,暫時只用到默認為0的情況。
? ? ?函數使用實例:
[cpp]?view plaincopy
namedWindow("img");?? setMouseCallback("img",on_mouse,0);??
? ? 1.2 鼠標響應處理函數
? ? ? ?opencv2.4.5中,鼠標相應處理函數一般默認形參和返回參數,函數形式如下:
[cpp]?view plaincopy
void?on_mouse(int?event,int?x,int?y,int?flags,void?*ustc)??
? ? ? 函數參數介紹:
? ? ??int event,鼠標操作時間的整數代號,在opencv2.4.5中,event鼠標事件總共有10中,從0-9依次代表如下:
Event:
[cpp]?view plaincopy
#define?CV_EVENT_MOUSEMOVE?0?????????????滑動?? #define?CV_EVENT_LBUTTONDOWN?1???????????左鍵點擊?? #define?CV_EVENT_RBUTTONDOWN?2???????????右鍵點擊?? #define?CV_EVENT_MBUTTONDOWN?3???????????中間點擊?? #define?CV_EVENT_LBUTTONUP?4?????????????左鍵釋放?? #define?CV_EVENT_RBUTTONUP?5?????????????右鍵釋放?? #define?CV_EVENT_MBUTTONUP?6?????????????中間釋放?? #define?CV_EVENT_LBUTTONDBLCLK?7?????????左鍵雙擊?? #define?CV_EVENT_RBUTTONDBLCLK?8?????????右鍵雙擊?? #define?CV_EVENT_MBUTTONDBLCLK?9?????????中間釋放??
? ? ?int x,int y,代表鼠標位于窗口的(x,y)坐標位置,窗口左上角默認為原點,向右為x軸,向下為y軸,
? ? ?int flags,代表鼠標的拖拽事件,以及鍵盤鼠標聯合事件,總共有32種事件,依次如下:
flags:
[cpp]?view plaincopy
#define?CV_EVENT_FLAG_LBUTTON?1???????????左鍵拖拽?? #define?CV_EVENT_FLAG_RBUTTON?2???????????右鍵拖拽?? #define?CV_EVENT_FLAG_MBUTTON?4???????????中間拖拽?? #define?CV_EVENT_FLAG_CTRLKEY?8?????(8~15)按Ctrl不放事件?? #define?CV_EVENT_FLAG_SHIFTKEY?16???(16~31)按Shift不放事件?? #define?CV_EVENT_FLAG_ALTKEY?32???????(32~39)按Alt不放事件(后面8-39還有待研究)??
? ??void *ustc,函數參數的編號(暫時用不到)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第二節 鼠標操作實例
? ? ? ? 2.1 示例程序代碼
? ? ? ? 程序如下,已經附上說明:
[cpp]?view plaincopy
#include?<opencv2/core/core.hpp>?? #include?<opencv2/highgui/highgui.hpp>?? #include?<stdio.h>?? ?? using?namespace?cv;?? ?? cv::Mat?org,dst,img,tmp;?? void?on_mouse(int?event,int?x,int?y,int?flags,void?*ustc)?? {?? ????static?Point?pre_pt?=?(-1,-1);?? ????static?Point?cur_pt?=?(-1,-1);?? ????char?temp[16];?? ????if?(event?==?CV_EVENT_LBUTTONDOWN)?? ????{?? ????????org.copyTo(img);?? ????????sprintf(temp,"(%d,%d)",x,y);?? ????????pre_pt?=?Point(x,y);?? ????????putText(img,temp,pre_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255),1,8);?? ????????circle(img,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0);?? ????????imshow("img",img);?? ????}?? ????else?if?(event?==?CV_EVENT_MOUSEMOVE?&&?!(flags?&?CV_EVENT_FLAG_LBUTTON))?? ????{?? ????????img.copyTo(tmp);?? ????????sprintf(temp,"(%d,%d)",x,y);?? ????????cur_pt?=?Point(x,y);?? ????????putText(tmp,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));?? ????????imshow("img",tmp);?? ????}?? ????else?if?(event?==?CV_EVENT_MOUSEMOVE?&&?(flags?&?CV_EVENT_FLAG_LBUTTON))?? ????{?? ????????img.copyTo(tmp);?? ????????sprintf(temp,"(%d,%d)",x,y);?? ????????cur_pt?=?Point(x,y);?? ????????putText(tmp,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));?? ????????rectangle(tmp,pre_pt,cur_pt,Scalar(0,255,0,0),1,8,0);?? ????????imshow("img",tmp);?? ????}?? ????else?if?(event?==?CV_EVENT_LBUTTONUP)?? ????{?? ????????org.copyTo(img);?? ????????sprintf(temp,"(%d,%d)",x,y);?? ????????cur_pt?=?Point(x,y);?? ????????putText(img,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));?? ????????circle(img,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0);?? ????????rectangle(img,pre_pt,cur_pt,Scalar(0,255,0,0),1,8,0);?? ????????imshow("img",img);?? ????????img.copyTo(tmp);?? ?????????? ????????int?width?=?abs(pre_pt.x?-?cur_pt.x);?? ????????int?height?=?abs(pre_pt.y?-?cur_pt.y);?? ????????if?(width?==?0?||?height?==?0)?? ????????{?? ????????????printf("width?==?0?||?height?==?0");?? ????????????return;?? ????????}?? ????????dst?=?org(Rect(min(cur_pt.x,pre_pt.x),min(cur_pt.y,pre_pt.y),width,height));?? ????????namedWindow("dst");?? ????????imshow("dst",dst);?? ????????waitKey(0);?? ????}?? }?? void?main()?? {?? ????org?=?imread("1.jpg");?? ????org.copyTo(img);?? ????org.copyTo(tmp);?? ????namedWindow("img");?? ????setMouseCallback("img",on_mouse,0);?? ????imshow("img",img);?? ????cv::waitKey(0);?? }??
? ? ?2.2 程序運行結果分析
? ? ?程序源圖形:
? ? ?
? ?程序運行結果:
? ??
總結
以上是生活随笔為你收集整理的鼠标的几种响应的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。