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
原创粉丝点击