生活随笔
收集整理的這篇文章主要介紹了
鼠标的几种响应
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
opencv2鼠標(biāo)響應(yīng)操作的函數(shù),下面分別介紹一下:
? ? 1.1 回調(diào)函數(shù)
? ? ? opencv2.4.5中,提供的鼠標(biāo)回調(diào)函數(shù)是 setMouseCallback,函數(shù)聲明如下:
[cpp]?view plaincopy
CV_EXPORTS?void?setMouseCallback(const?string&?winname,?MouseCallback?onMouse,?void*?userdata?=?0);??
? ? ?函數(shù)參數(shù)介紹
? ? ? ? ? ? const string& winname,windows視窗名稱,對(duì)名為winname的視窗進(jìn)行鼠標(biāo)監(jiān)控。
? ? ? ? ? ??MouseCallback onMouse,鼠標(biāo)響應(yīng)處理函數(shù),監(jiān)聽鼠標(biāo)的點(diǎn)擊,移動(dòng),松開,判斷鼠標(biāo)的操作類型,并進(jìn)行響應(yīng)的函數(shù)處理。
? ? ? ? ? ??void* userdata = 0 鼠標(biāo)響應(yīng)處理函數(shù)的ID,與鼠標(biāo)相應(yīng)處理函數(shù)相匹配就行,暫時(shí)只用到默認(rèn)為0的情況。
? ? ?函數(shù)使用實(shí)例:
[cpp]?view plaincopy
namedWindow("img");?? setMouseCallback("img",on_mouse,0);??
? ? 1.2 鼠標(biāo)響應(yīng)處理函數(shù)
? ? ? ?opencv2.4.5中,鼠標(biāo)相應(yīng)處理函數(shù)一般默認(rèn)形參和返回參數(shù),函數(shù)形式如下:
[cpp]?view plaincopy
void?on_mouse(int?event,int?x,int?y,int?flags,void?*ustc)??
? ? ? 函數(shù)參數(shù)介紹:
? ? ??int event,鼠標(biāo)操作時(shí)間的整數(shù)代號(hào),在opencv2.4.5中,event鼠標(biāo)事件總共有10中,從0-9依次代表如下:
Event:
[cpp]?view plaincopy
#define?CV_EVENT_MOUSEMOVE?0?????????????滑動(dòng)?? #define?CV_EVENT_LBUTTONDOWN?1???????????左鍵點(diǎn)擊?? #define?CV_EVENT_RBUTTONDOWN?2???????????右鍵點(diǎn)擊?? #define?CV_EVENT_MBUTTONDOWN?3???????????中間點(diǎn)擊?? #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,代表鼠標(biāo)位于窗口的(x,y)坐標(biāo)位置,窗口左上角默認(rèn)為原點(diǎn),向右為x軸,向下為y軸,
? ? ?int flags,代表鼠標(biāo)的拖拽事件,以及鍵盤鼠標(biāo)聯(lián)合事件,總共有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,函數(shù)參數(shù)的編號(hào)(暫時(shí)用不到)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第二節(jié) 鼠標(biāo)操作實(shí)例
? ? ? ? 2.1 示例程序代碼
? ? ? ? 程序如下,已經(jīng)附上說明:
[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 程序運(yùn)行結(jié)果分析
? ? ?程序源圖形:
? ? ?
? ?程序運(yùn)行結(jié)果:
? ??
總結(jié)
以上是生活随笔為你收集整理的鼠标的几种响应的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。