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 }
  • 相关阅读:
    图片上传-下载-删除等图片管理的若干经验总结3-单一业务场景的完整解决方案
    图片上传-下载-删除等图片管理的若干经验总结2
    HDU 1195 Open the Lock
    HDU 1690 Bus System
    HDU 2647 Reward
    HDU 2680 Choose the best route
    HDU 1596 find the safest road
    POJ 1904 King's Quest
    CDOJ 889 Battle for Silver
    CDOJ 888 Absurdistan Roads
  • 原文地址:https://www.cnblogs.com/Long-w/p/9661738.html
Copyright © 2011-2022 走看看