在OpenCV中的鼠标事件

opencv中 highgui_c.h  提供的函数

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_LBUTTONDBLCLK  =7,
    CV_EVENT_RBUTTONDBLCLK  =8,
    CV_EVENT_MBUTTONDBLCLK  =9
};


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
};

那个用于处理的函数如下:

typedef void (CV_CDECL *CvMouseCallback )(int event, int x, int y, int flags, void* param);

/* assign callback for mouse events */  回调函数

CVAPI(void) cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse,

                                void* param CV_DEFAULT(NULL));

处理函数  取点 例如:
void mouseHandler_(int event, int x, int y, int flags, void* p) {
    if (event == CV_EVENT_LBUTTONDOWN) {
        *((Point*) p) = Point(x, y);
    }
}

     主函数中   取到点  然后复制给startPoint
        while(1){
            cvSetMouseCallback("global", mouseHandler_,
                               (void*) &chosePoint1);


            if(chosePoint1.x != 0 && chosePoint1.y != 0){
                cout<<"选择的起点是"<<chosePoint1<<endl;
                 startPoint = chosePoint1;
                break;
            }
             waitKey(20);

        }


  1. #include <opencv2/opencv.hpp>  
  2. #include<string>  
  3. using namespace cv;  
  4. RNG g_rng(12345);//毛大大的博客里看到的生成随机数,用于生成随机颜色  
  5. bool 是否画矩形 = false;//不可避免地还是要定义几个全局变量,伤心  
  6. Point 左击顶点=Point(-1,-1);  
  7. Point 鼠标位置= Point(-1, -1);  
  8.   
  9. void on_mouse(int event, int x, int y, int flags, void *ustc)  
  10. //event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号      
  11. {  
  12.     Mat& image = *(cv::Mat*) ustc;//这样就可以传递Mat信息了,很机智  
  13.     char temp[16];  
  14.     switch (event) {  
  15.     case CV_EVENT_LBUTTONDOWN://按下左键  
  16.     {  
  17.         sprintf(temp, "(%d,%d)", x, y);  
  18.         putText(image, temp, Point(x, y), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));  
  19.         是否画矩形 = true;  
  20.         左击顶点= Point(x, y);  
  21.     }   break;  
  22.     case CV_EVENT_MOUSEMOVE://移动鼠标  
  23.     {  
  24.         鼠标位置 = Point(x, y);  
  25.         if (是否画矩形)  
  26.         { }  
  27.     }break;  
  28.     case EVENT_LBUTTONUP:  
  29.     {  
  30.         是否画矩形 = false;  
  31.         sprintf(temp, "(%d,%d)", x, y);  
  32.         putText(image, temp, Point(x, y), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));  
  33.         //调用函数进行绘制  
  34.         cv::rectangle(image,左击顶点, 鼠标位置, cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色    
  35.     }break;  
  36. }  
  37. }  
  38.   
  39. int main()  
  40. {  
  41.   
  42. system("color 9F");//毛大大程序里的,改变console颜色      
  43. Mat org = imread("2.jpg"),temp1,temp2;  
  44.     while (waitKey(30) != 27) {  
  45.     org.copyTo(temp1);//用来显示点的坐标以及临时的方框  
  46.     namedWindow("img");//定义一个img窗口   
  47.     setMouseCallback("img", on_mouse, (void*)&org);//调用回调函数      
  48.     if(是否画矩形)rectangle(temp1, 左击顶点, 鼠标位置, cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色    
  49.     putText(temp1,"("+std::to_string(鼠标位置.x)+","+std::to_string(鼠标位置.y)+")" , 鼠标位置, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));  
  50.     imshow("img",temp1);  
  51.     }  
  52.   
  53. }  

猜你喜欢

转载自blog.csdn.net/xiaoma_bk/article/details/79278051