opencv鼠标操作及GUI矩形绘画
来源:互联网 发布:mac开发人工智能软件 编辑:程序博客网 时间:2024/05/18 00:04
OpenCV的鼠标操作是通过一个中介函数配合回调函数来实现的。指定鼠标操作消息回调函数的函数为SetMouseCallback。
void setMouseCallback(const string& winname,MouseCallback onMouse,void* userdata=0)
参数介绍
· const string& winname 窗口名
· MouseCallback onMouse,鼠标响应处理函数,监听鼠标的点击,移动,松开,判断鼠标的操作类型,并进行响应的函数处理。
· void* userdata = 0 鼠标响应处理函数的ID,与鼠标相应处理函数相匹配
void on_mouse(int event,int x,int y,int flags,void* param)
· int event,鼠标操作时间的整数代号,在opencv2.4.5中,event鼠标事件总共有10中,从0-9依次代表如下:
#define CV_EVENT_MOUSEMOVE 0 滑动 #define CV_EVENT_LBUTTONDOWN 1 左键点击 #define CV_EVENT_RBUTTONDOWN 2 右键点击 #define CV_EVENT_MBUTTONDOWN 3 中间点击 #define CV_EVENT_LBUTTONUP 4 左键释放 #define CV_EVENT_RBUTTONUP 5 右键释放 #define CV_EVENT_MBUTTONUP 6 中间释放 #define CV_EVENT_LBUTTONDBLCLK 7 左键双击 #define CV_EVENT_RBUTTONDBLCLK 8 右键双击 #define CV_EVENT_MBUTTONDBLCLK 9 中间释放
· x和y是鼠标指针在图像坐标系(需要注意,不是窗口坐标系)中的坐标值
· int flags,代表鼠标的拖拽事件,以及键盘鼠标联合事件,总共有32种事件,依次如下:
#define CV_EVENT_FLAG_LBUTTON 1 左键拖拽 #define CV_EVENT_FLAG_RBUTTON 2 右键拖拽 #define CV_EVENT_FLAG_MBUTTON 4 中间拖拽 #define CV_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件 #define CV_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件 #define CV_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放事件
· param是用户定义的传递到SetMouseCallback函数调用的参数
示例程序代码:
#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 );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 ){ cv::rectangle(img,box.tl(),box.br(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//随机颜色}
程序运行结果截图
因公司项目需要初探OpenCV,文中不足之处还请指正。本文源码来自于《OpenCV3编程入门》
0 0
- opencv鼠标操作及GUI矩形绘画
- Opencv 鼠标事件GUI
- opencv用鼠标画矩形
- Opencv鼠标描绘矩形框
- OpenCV的鼠标操作——用鼠标画矩形(代码解读)
- OpenCV鼠标画图例程,鼠标绘制矩形
- OpenCV鼠标画图例程,鼠标绘制矩形
- OpenCV鼠标画图例程,鼠标绘制矩形
- matlab gui 鼠标选择矩形区域 返回鼠标坐标点
- opencv中实现鼠标选定矩形框
- OpenCV利用鼠标进行矩形ROI选取
- opencv 使用鼠标选定矩形框
- Opencv中利用鼠标绘制矩形
- opencv-鼠标在窗口中画矩形
- opencv鼠标四点获取一个矩形
- opencv 鼠标操作
- Opencv鼠标操作
- OpenCV之鼠标操作
- Linux常用命令大全
- 几个常考字符串函数处理
- 运行 iOS 模拟器中的 App 后显示空白-warning:Unsupported Configuration: Scene is unreachable due…
- 设计模式五大原则
- js和el表达式操作list
- opencv鼠标操作及GUI矩形绘画
- 提取《你必须知道的495个C语言问题》一书中的个人要点
- jQuery实现冻结 固定 表格行和列 (未测试)
- C++ ABI之名字改编(以Qt为例)
- JAVA的Swing图形界面与内部类
- C语言输出PI和正弦函数和余弦函数
- 1011. A+B和C (15)-PAT乙级真题
- hibernate3 的常用操作(批量删除,批量插入,关联查询) (未测试)
- Android 开发之Handler+Thread开发