OpenCV 鼠标操作 SetMouseCallback
鼠标操作消息回调函数的函数为 SetMouseCallback。
原型:
void setMouseCallback(const string& winname, MouseCallback onMouse, void *userdata = 0);
- 第一个参数:窗口名字;
- 第二个参数:指定窗口里每次鼠标事件发生的时候,被调用的函数指针。原型:void Foo(int event, int x, int y, int flags, void *param);
- 第三个参数:用户定义的传递到回调函数的参数,默认值 0。
#include <opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_NAME "【程序窗口】"
/********全局函数声明**********/
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectange(Mat& img, Rect box);
//void ShowHelpText();  
/********全局变量声明*********/
Rect g_rectangle;
bool g_bDrawingBox = false; // 是否进行绘制
RNG g_rng(12345);
int main(int argc, char ** argv)
{
    g_rectangle = Rect(-1, -1, 0, 0);
    Mat srcImage(600, 800, CV_8UC3), tempImage;
    srcImage.copyTo(tempImage);
    //g_rectangle = Rect(-1, -1, 0, 0);
    srcImage = Scalar::all(0);
    // 设置鼠标操作回调函数
    namedWindow(WINDOW_NAME);
    setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);
    // 程序主循环, 当绘制标识符位真时,进行绘制
    while (1)
    {
        srcImage.copyTo(tempImage);
        if (g_bDrawingBox) {
            DrawRectange(tempImage, g_rectangle); // 绘制
        }
        imshow(WINDOW_NAME, tempImage);
        if (waitKey(10) == 27) {
            break; // ESC 键按下,退出程序
        }
    }
    return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
    Mat& image = *(Mat*)param;
    switch (event)
    {
        // 鼠标移动消息
    case EVENT_MOUSEMOVE:
        // 如果绘制标识为真,记录下长和宽到 RECT 中
        if (g_bDrawingBox) {
            g_rectangle.width = x - g_rectangle.x;
            g_rectangle.height = y - g_rectangle.y;
        }
        break;
        // 左键按下
    case EVENT_LBUTTONDOWN:
        g_bDrawingBox = true;
        g_rectangle = Rect(x, y, 0, 0);// 记录起始点
        break;
        // 左键抬起
    case EVENT_LBUTTONUP:
        g_bDrawingBox = false; // 置标识位 false
        // 对宽和高小于 0 的处理
        if (g_rectangle.width < 0) {
            g_rectangle.x += g_rectangle.width;
            g_rectangle.width *= -1;
        }
        if (g_rectangle.height < 0) {
            g_rectangle.y += g_rectangle.height;
            g_rectangle.height *= -1;
        }
        DrawRectange(image, g_rectangle);
        break;
    default:
        break;
    }
}
// 自定义矩形绘制函数
void DrawRectange(Mat& img, Rect box)
{
    rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255))); // 随机颜色
}

参考:  
《OpenCV3 编程入门》 毛星云 P78
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号