zoukankan      html  css  js  c++  java
  • 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:滚动条的名称

      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 }
  • 相关阅读:
    整数的二进制表示中1的个数
    最长公共子序列
    关于使浏览器崩溃的代码尝试
    wp7 独立存储
    动态引用样式表
    锋利的jQuery小记……
    DataGridVidw添加CheckBox。并通过一个 CheckBox来控制其全选。
    全选按钮的使用。winfrom程序中,对全选按钮的理解,欢迎拍砖!
    Ul li 超出文本显示省略号JS右键控制 本人QQ:267307031 空间更多技术咨询
    FileUpload控件
  • 原文地址:https://www.cnblogs.com/Long-w/p/9661738.html
Copyright © 2011-2022 走看看