首页 > 其他 > 详细

opencv 鼠标操作

时间:2019-02-27 18:43:39      阅读:147      评论:0      收藏:0      [点我收藏+]
#include <opencv2/opencv.hpp>
using namespace cv;

#define WINDOW_NAME "【程序窗口】"        //为窗口标题定义的宏 


Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);


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)
                                )
                );//随机颜色
}


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;
}

技术分享图片

 

opencv 鼠标操作

原文:https://www.cnblogs.com/hehe2014/p/10445783.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!