OpenCV学习记录 鼠标操作
2018-04-01 16:13
357 查看
#include<opencv2/opencv.hpp> using namespace cv; #define WINDOW_NAME "【程序窗口】" //-------------【全局函数声明部分】---------------------------- //描述:全局函数声明 //------------------------------------------------------------- void on_MouseHandle(int event, int x, int y, int flags, void* param); void DrawRectangle(cv::Mat&img, cv::Rect box); void ShowHelpText(); //------------------【全局变量声明部分】----------------------- //描述:全局变量声明 //------------------------------------------------------------- Rect g_rectangle; bool g_bDrawingBox = false;//是否进行绘制 RNG g_rng(12345); //------------------【主函数】----------------------- //描述:控制台应用程序的入口函数 //------------------------------------------------------------- int main(int argc, char** argv) { //【1】准备参数 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); //【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; } //------------------【on_MouseHandle()函数】----------------------- //描述:鼠标回调函数,根据不同的鼠标事件进行不同操作 //------------------------------------------------------------- void on_MouseHandle(int event, int x, int y, int flags, void*param) { Mat& image = *(cv::Mat*)param; switch (event) { //鼠标移动消息 case EVENT_MOUSEMOVE: { 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; } //调用函数进行绘制 DrawRectangle(image, g_rectangle); } break; } } //------------------【DrawRectangle()函数】----------------------- //描述:自定义的矩形绘制函数 //------------------------------------------------------------- void DrawRectangle(cv::Mat& img, cv::Rect box) { rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色 }
相关文章推荐
- openCV学习记录:滤镜:线条&素描
- Opencv 学习笔记--错误记录
- OpenCV学习记录(一):使用haar分类器进行人脸识别
- OpenCV学习记录(十四)—相机坐标系到世界坐标系的变换
- OpenCV官方文档学习记录(10)
- OpenCV 学习记录2 图像简单处理及调用摄像头
- OpenCV官方文档学习记录(2)
- opencv 编译 -- 菜鸟学习记录,高手请绕道。
- 学习opencv记录(二)
- OpenCV官方文档学习记录(11)
- openCV学习记录:滤镜:熔铸&冰冻
- PIL opencv 学习网站记录
- 学习opencv记录
- qt+opencv学习进程记录
- opencv学习记录20140305
- Java学习记录--OpenCV使用教程
- OpenCV学习记录一:图像的读取与显示
- opencv学习记录
- opencv学习记录(4)OpenCV如何扫描图像、利用查找表和计时
- 【学习笔记】【python+opencv】疑惑记录