一、鼠标事件
(1)鼠标操作
指定鼠标操作消息回调函数,setMouseCallback(),原型如下:
1 CV_EXPORTS void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0); 2 vinname:窗口名 3 onMouse:鼠标事件时被调用的函数指针,原型形式: 4 void Fun(int event, int x, int y, int flags, void* param); 5 userdata:用户定义传到回调函数的参数,默认值0
在回调函数void Fun(int event, int x, int y, int flags, void* param);中 event的类型有: enum { CV_EVENT_MOUSEMOVE = 0, CV_EVENT_LBUTTONDOWN = 1, CV_EVENT_RBUTTONDOWN = 2, CV_EVENT_MBUTTONDOWN = 3, CV_EVENT_LBUTTONUP = 4, CV_EVENT_RBUTTONUP = 5, CV_EVENT_MBUTTONUP = 6, CV_EVENT_LBUTTONDBLCK = 7, CV_EVENT_RBUTTONDBLCK = 8, CV_EVENT_MBUTTONDBLCK = 9 }; flags的类型有: enum { CV_EVENT_FLAG_LBUTTON = 1, CV_EVENT_FLAG_RBUTTON = 2, CV_EVENT_FLAG_MBUTTON = 4, CV_EVENT_FLAG_CTRLKEY = 8, CV_EVENT_FLAG_SHIFTKEY = 16, CV_EVENT_FLAG_ALTKEY = 32 };
【示例】
1 //鼠标事件 2 #include<opencv2/opencv.hpp> 3 #include<iostream> 4 5 using namespace cv; 6 using namespace std; 7 8 Mat img(500,500,CV_8UC3,Scalar(255,255,255));//定义成全局变量 9 10 void OnMouse(int event,int x,int y,int flags,void* param){ 11 if(event==CV_EVENT_LBUTTONDOWN){//如果鼠标左键按下 12 cout<<"mouse down"<<endl;//控制台输出 13 circle(img,Point(x,y),80,Scalar(255,255,0),2,8);//在全局变量img上画圆 14 } 15 } 16 17 int main(){ 18 namedWindow("mouse",CV_WINDOW_AUTOSIZE); 19 setMouseCallback("mouse",OnMouse,0); 20 while(1){ 21 imshow("mouse",img); 22 if(27==waitKey(10))//每隔10毫秒检测是否按下esc键 23 break; 24 } 25 return 0; 26 }
【示例2】
1 //鼠标事件2 2 #include<opencv2/opencv.hpp> 3 #include<iostream> 4 using namespace cv; 5 using namespace std; 6 7 Point pt; 8 void OnMouse(int event,int x,int y,int flags,void* param){ 9 Mat img=*(Mat*)param;//将param强制转换为Mat指针,*(Mat*)=Mat,就如*(int*)=int一样 10 switch(event){ 11 case CV_EVENT_LBUTTONDOWN://鼠标左键按下时 12 pt.x=x; 13 pt.y=y; 14 break; 15 case CV_EVENT_LBUTTONUP://鼠标左键抬起时 16 rectangle(img,pt,Point(x,y),Scalar(0,255,0),2,8); 17 break; 18 default: 19 break; 20 } 21 } 22 23 int main() 24 { 25 Mat img(500,500,CV_8UC3,Scalar(255,255,255)); 26 namedWindow("mouse",CV_WINDOW_AUTOSIZE); 27 setMouseCallback("mouse",OnMouse,&img);//传入img的地址,这样就不必将img设置成全局变量了 28 29 while(1){ 30 imshow("mouse",img); 31 if(27==waitKey(10))//每隔10毫秒检测是否按下esc键 32 break; 33 } 34 return 0; 35 }
二、滑动条操作
创建滑动条并指定回调函数,createIrackbar()原型如下:
CV_EXPORTS int createTrackbar(const string& trackbarname,
const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void * userdata = 0);
trackbarname:滚动条的名称
winname:滚动条所依附的窗口名称(由namedWindow创建)
value:指向型指针,表示滑块位置
count:滑块最大位置,默认最小位置为0
onChange:指向回调函数的指针,原型必须为void xxx(int, void*);
userdata:用户传给回调函数的数据,默认为0
1 CV_EXPORTS_W int getTrackbarPos(const string& trackbarname, const string& winname); 2 获取滚动条的当前位置
【示例】
1 //滚动条 2 #include<opencv2/opencv.hpp> 3 #include<iostream>
4 using namespace cv; 5 using namespace std; 6 7 Mat dst; 8 int value=20; 9 10 void onChange(int,void* param){ 11 Mat src=*(Mat*)param; 12 threshold(src,dst,value,255,THRESH_BINARY);//二值化 13 //Canny(src,dst,value,255);//canny边缘检测 14 imshow("TrackBar",dst); 15 } 16 17 int main(){ 18 Mat src=imread("1.jpg",0);//读入灰度图 19 20 namedWindow("TrackBar",CV_WINDOW_AUTOSIZE); 21 createTrackbar("Threshold","TrackBar",&value,255,onChange,&src); 22 23 threshold(src,dst,value,255,THRESH_BINARY); 24 Canny(src,dst,value,255); 25 imshow("TrackBar",dst); 26 27 waitKey(0); 28 return 0; 29 }