7、【opencv入门】鼠标和滑动条操作

一、鼠标事件

(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:滚动条的名称

  vinname:滚动条所依附的窗口名称(由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 }

猜你喜欢

转载自www.cnblogs.com/Long-w/p/9661738.html