@[toc]
1、鼠標(biāo)事件
1.1佃却、setMouseCallback()
函數(shù)
void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
- winname: 窗口名稱
- OnMouse : 鼠標(biāo)事件的回調(diào)函數(shù)
- userdata : 傳遞給回調(diào)函數(shù)的參數(shù)康铭,可選
typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);
參數(shù)說明:
- event: 鼠標(biāo)事件
- x : 鼠標(biāo)事件的x坐標(biāo)
- y : 鼠標(biāo)事件的y坐標(biāo)
- flags: 鼠標(biāo)事件的標(biāo)志
- userdata : 傳遞給回調(diào)函數(shù)的參數(shù),可選
1.2颠毙、event事件
- CV_EVENT_MOUSEMOVE :鼠標(biāo)移動(dòng)
- CV_EVENT_LBUTTONDOWN : 鼠標(biāo)左鍵按下
- CV_EVENT_RBUTTONDOWN : 鼠標(biāo)右鍵按下
- CV_EVENT_MBUTTONDOWN : 鼠標(biāo)中鍵按下
- CV_EVENT_LBUTTONUP : 鼠標(biāo)左鍵放開
- CV_EVENT_RBUTTONUP : 右鍵放開
- CV_EVENT_MBUTTONUP : 中鍵放開
- CV_EVENT_LBUTTONDBLCLK : 左鍵雙擊
- CV_EVENT_RBUTTONDBLCLK : 右鍵雙擊
- CV_EVENT_MBUTTONDBLCLK : 中鍵雙擊
- CV_EVENT_MOUSEWHEEL : 鼠標(biāo)向前(+)或向后(-)滑動(dòng)
- CV_EVENT_MOUSEHWHEEL : 鼠標(biāo)向右(+)或向左(-)滑動(dòng)
1.3副瀑、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按下不放
1.4舱污、示例1-雙擊畫圓
目標(biāo)
雙擊鼠標(biāo)左鍵時(shí)想幻,在圖像上以當(dāng)前鼠標(biāo)點(diǎn)為圓心繪制圓心和空心圓
代碼
#include <QCoreApplication>
#include "opencv2/opencv.hpp"
using namespace cv;
Mat src = imread("./../../images/book.bmp");
//鼠標(biāo)事件回調(diào)函數(shù)粱栖,雙擊左鍵時(shí),以鼠標(biāo)點(diǎn)為圓心脏毯,半徑為100闹究,畫空心圓
void mouseCallBack(int event,int x,int y, int flags, void *data){
if (event == EVENT_LBUTTONDBLCLK){
//畫圓
circle(src,Point(x,y),100,Scalar(255,0,0),1);
//畫圓心
circle(src,Point(x,y),1,Scalar(255,0,0),-1);
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//創(chuàng)建一個(gè)窗口
namedWindow("mouseDemo");
//鼠標(biāo)事件回調(diào)
setMouseCallback("mouseDemo",mouseCallBack);
while (1) {
imshow("mouseDemo",src); //顯示
if(waitKey(20) == 'q'){ //按q退出
break;
};
}
destroyAllWindows();
return 0;
}
結(jié)果
1.5、示例2-拖拽畫矩形和園
目標(biāo)
- modeFlag為真時(shí)食店,按下并拖拽鼠標(biāo)畫矩形
- modeFlag為假時(shí)渣淤,按下并拖拽鼠標(biāo)時(shí)畫連續(xù)的圓
代碼
#include <QCoreApplication>
#include <QString>
#include "opencv2/opencv.hpp"
using namespace cv;
bool drawingFlag = false;//按下鼠標(biāo)為真
bool modeFlag = true; //為真時(shí)繪制矩形,如果要繪制圓吉嫩,把他設(shè)置為false即可
int ix = -1;
int iy = -1;
Mat src = imread("./../../images/book.bmp");
//鼠標(biāo)事件回調(diào)函數(shù)
void mouseCallBack(int event,int x,int y, int flags, void *data){
if (event == EVENT_LBUTTONDOWN){ //鼠標(biāo)左鍵按下
drawingFlag = true;
ix = x;
iy = y;
}
else if(event == EVENT_MOUSEMOVE){ //鼠標(biāo)移動(dòng)
if(drawingFlag == true){ //鼠標(biāo)左鍵按下
if(modeFlag == true){ //畫矩形
//以當(dāng)前點(diǎn)坐標(biāo)為矩形左上角价认,按下點(diǎn)坐標(biāo)為矩形右下角,畫矩形
rectangle(src,Point(ix,iy),Point(x,y),Scalar(0,255,0),-1);
}
else{ //畫圓
circle(src,Point(x,y),50,Scalar(255,0,0),1);
//畫圓心
circle(src,Point(x,y),1,Scalar(255,0,0),-1);
}
}
}
else if(event == EVENT_LBUTTONUP){ //鼠標(biāo)左鍵松開
drawingFlag = false;
if(modeFlag == true){
//以當(dāng)前點(diǎn)坐標(biāo)為矩形左上角自娩,按下點(diǎn)坐標(biāo)為矩形右下角用踩,畫矩形
rectangle(src,Point(ix,iy),Point(x,y),Scalar(0,255,0),-1);
}
else{ //畫圓
circle(src,Point(x,y),50,Scalar(255,0,0),1);
//畫圓心
circle(src,Point(x,y),1,Scalar(255,0,0),-1);
}
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
namedWindow("mouseDemo");
//鼠標(biāo)
setMouseCallback("mouseDemo",mouseCallBack);
while (1) {
imshow("mouseDemo",src);
if(waitKey(20) == 'q'){
break;
};
}
destroyAllWindows();
return 0;
}
結(jié)果