主要是使用opencv中的鼠标操作 —-setMOuseCallback函数的作用是为指定窗口设置鼠标回调函数,原型如下。
C++:void setMouseCallback(conststring& winname, MouseCallback onMouse,void* userdata = 0) /************************************************************************* > File Name: 3-3.cpp > Author: zsj > Mail: fj_zsj@163.com > Created Time: Wed 08 Mar 2017 07:11:58 PM CST ************************************************************************/ #include<iostream> #include <cstdio> #include <cstdlib> #include <opencv2/opencv.hpp> #define WINDOW_NAME "program_window" using namespace cv; using namespace std; void on_MouseHandle(int event, int x, int y, int flags, void* param); //对鼠标触发事件进行判断处理 void DrawRectangle(cv::Mat& img, cv::Rect box); //画出矩形 int cnt; Rect g_rectangle; bool g_bDrawingBox = false;//是否进行绘制 RNG g_rng(12345); //Scalar格式 int main(int argc, char **argv) { [1]初始化参数 cnt = 0; g_rectangle = Rect(-1, -1, 0, 0); Mat srcImage = imread("1.jpg"); Mat tempImage; if ( !srcImage.data ) printf("read image fail!\n"); srcImage.copyTo(tempImage); // g_rectangle = Rect(-1, -1, 0, 0); // srcImage = Scalar::all(0); [2]设置鼠标操作回调函数 namedWindow(WINDOW_NAME); setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage); [3]开始判断是否进行绘制操作 while(1) { srcImage.copyTo(tempImage); //复制源图到临时变量 if( g_bDrawingBox ) DrawRectangle( 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 = *(cv::Mat*) param; printf("----------<x,y>-----------\n"); printf("cnt = %d, <%d %d>\n", ++cnt, x, y); printf("----------<x,y>-----------\n"); switch( event ) { // 鼠标移动消息 case EVENT_MOUSEMOVE:{ if (g_bDrawingBox) { //绘制标识为真,则记录下长和宽到RECT变量中 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; 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; } DrawRectangle(image, g_rectangle ); } break; default: printf("error!\n"); } } //自定义的矩形绘制函数 void DrawRectangle(cv::Mat& img, cv::Rect box){ rectangle(img, box.tl(), box.br(), Scalar(RNG(210), RNG(0),RNG(90)), 2, 1, 0); }Reference: 《OpenCV3编程入门》 《数字图像处理》 《c++编程》