opencv学习笔记——鼠标操作
来源:互联网 发布:影楼美工设计教程 编辑:程序博客网 时间:2024/05/29 17:28
#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;}/* 鼠标回调函数,根据不同的鼠标事件进行不同的操作 */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) { //如果是否进行绘制的标识符为真,则记录下长和宽到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; //置标识符为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; }}/* 自定义矩形绘制函数 */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)));}
setMouseCallback函数
void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0)
鼠标回调函数
void Foo(int event, int x, int y, int flags, void* param)
event是EVENT_+变量之一,x和y是鼠标指针在图像坐标系中的坐标,flags是EVENT_FLAG的组合,param是用户传递到setMouseCallback函数调用的参数。
Rect函数
Rect(x,y,width,height)
x, y 为左上角坐标, width, height 则为长和宽。
//利用对角线两点来画矩形:void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)//传入矩形参数来画矩形:void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )
阅读全文
0 0
- opencv学习笔记——鼠标操作
- openCV学习笔记-鼠标操作
- opencv学习笔记(6)----鼠标操作
- Opencv 学习笔记之——鼠标操作画出感兴趣区域
- Win32学习笔记——鼠标操作
- OpenCV学习笔记——点击显示鼠标坐标
- OpenCV学习笔记——点击显示鼠标坐标
- 【OpenCV学习笔记】八、鼠标与滑动条操作
- opencv学习笔记—8,阈值操作
- OpenCV学习笔记(1)——操作像素
- opencv学习笔记(二十一)——阈值操作
- (学习笔记)threshold —— opencv阈值操作
- OpenCV学习笔记(四)—矩阵和图像操作
- opencv 学习笔记2—XML读写操作
- OpenCV学习笔记之鼠标调用
- OpenCV学习笔记4-鼠标绘图
- opencv学习笔记--形态学操作
- opencv 鼠标操作
- dockerfile介绍
- discoz论坛模板的一些细节记录
- 关于安卓sdk 文件相关
- 关于Docker,你要知道的都在这了
- ACM训练半周总结—11月2日
- opencv学习笔记——鼠标操作
- 嵌入式C语言之---模块化编程
- Unity+Vuforia实现AR图片识别应用
- noip2017 复习计划
- The best front-end hacking cheatsheets — all in one place.
- 深度学习之损失函数与激活函数的选择
- 布局改变时的过场动画
- 线段树[模板]
- 【WebService】第四章、Axis1.4发布WebService