• 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 }
  • 相关阅读:
    自动化测试用例设计实例
    day07 python2与python3 编码
    day06-2 数据结构
    遇到一个关于C#调用Microsoft.Office.Interop.Word实例化的一个问题
    关于C#调用matlab生成的dll的一些经验(亲测)
    javascript 检测浏览类型和版本
    图片自适应完美兼容IE8
    Java VS .NET:Java与.NET的特点对比
    【C#点滴记录】ASP.NET 使用C# 导出Word 和Excel
    关于现在IT行业从业者一些建议
  • 原文地址:https://www.cnblogs.com/Long-w/p/9661738.html
Copyright © 2020-2023  润新知