鼠标操作

一、鼠标操作SetMouseCallback()

 1 #include<opencv2opencv.hpp>
 2 #include<iostream>
 3 #include<vector>
 4 using namespace cv;
 5 using namespace std;
 6 
 7 #define WINDOW_NAME "【程序窗口】"
 8 
 9 void on_MouseHandle(int event, int x, int y, int flags, void* param);
10 void DrawRectangle(Mat &img, Rect box);
11 void ShowHelpText();
12 
13 Rect g_rectangle;
14 bool g_bDrawingBox = false; //是否进行绘制
15 RNG g_rng(12345);
16 
17 int main(int argc,char** argv) {
18     //Mat image1= imread("C:\Users\Nelsoner\Desktop\Camera Roll\05.jpg");
19     //Mat image2 = imread("C:\Users\Nelsoner\Desktop\Camera Roll\08.jpg");
20     
21     g_rectangle = Rect(-1,-1,0,0);
22     Mat srcImage(600,800,CV_8UC3),tempImage;
23     srcImage.copyTo(tempImage);
24     srcImage = Scalar::all(0);
25 
26     //设置鼠标操作回掉函数
27     namedWindow(WINDOW_NAME);
28     setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);
29 
30     //程序主循环,当进行绘制的标识符为真,进行绘制
31     while (1) {
32         srcImage.copyTo(tempImage);   //复制源图到临时变量
33         if (g_bDrawingBox)
34             DrawRectangle(tempImage,g_rectangle);
35         imshow(WINDOW_NAME,tempImage);
36         if (waitKey(10) == 27)   //按下ESC键,程序退出
37             break;
38     }
39     return 0;
40 }
41 
42 void on_MouseHandle(int event, int x, int y, int flags, void* param) {
43     Mat& image = *(Mat*)param;
44     switch (event) {
45         //鼠标移动消息
46         case EVENT_MOUSEMOVE:
47         {
48             if (g_bDrawingBox)  //如果是否进行绘制的标识符为真,则记录下长和宽到Rect型变量中
49             {
50                 g_rectangle.width = x - g_rectangle.x;
51                 g_rectangle.height = y - g_rectangle.y;
52             }
53         }
54         break;
55 
56         //左键按下消息
57         case EVENT_LBUTTONDOWN:
58         {
59             g_bDrawingBox = true;
60             g_rectangle = Rect(x, y, 0, 0);    //记录起始点
61         }
62         break;
63 
64         //左键抬起消息
65         case EVENT_LBUTTONUP:
66         {
67             g_bDrawingBox = false;   //置标识符为false
68             //对宽和高小于0的处理
69             if (g_rectangle.width < 0) {
70                 g_rectangle.x += g_rectangle.width;
71                 g_rectangle.width *= -1;
72             }
73             if (g_rectangle.height < 0) {
74                 g_rectangle.y += g_rectangle.height;
75                 g_rectangle.height *= -1;
76             }
77             //调用函数进行绘制
78             DrawRectangle(image,g_rectangle);
79         }
80         break;
81     }
82 }
83 
84 void DrawRectangle(Mat &img, Rect box)
85 {
86     rectangle(img,box.tl(),box.br(),Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255), g_rng.uniform(0, 255)));
87 }

效果图:

学习小总结:

1.OpenCV函数中输出图像的内存分配是自动完成的(如果不特别指定的话)

2.使用OpenCV的C++接口时不需要考虑内存释放问题

3.复制运算和拷贝构造函数只复制信息头

4.使用函数clone()或者copyTo()来复制一副图像的矩阵

原文地址:https://www.cnblogs.com/Nelsoner/p/6718957.html