• opencv:鼠标操作


    示例程序:

    #include <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()
    {
        g_rectangle = Rect(-1/*x*/, -1/*y*/, 0/*width*/, 0/*height*/); // Rect_<_Tp>::Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height): x(_x), y(_y), width(_width), height(_height) {}
        Mat srcImage(600, 800, CV_8UC3),tempImage;
        srcImage.copyTo(tempImage);
        srcImage = Scalar::all(0);
        
        // 设置鼠标操作回调函数
        namedWindow(WINDOW_NAME);
        setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);
        //程序主循环,当进行绘制的标识符为真的时候,进行绘制
        while (1)
        {
            srcImage.copyTo(tempImage); // 复制原图像到临时变量
            if (g_bDrawingBox)DrawRectangle(tempImage, g_rectangle); // 当进行绘制的标识符为真,则进行绘制
            imshow(WINDOW_NAME, tempImage);
            if (waitKey(10) == 27) break;
        }
        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) // 如果是否进行绘制的标识符为真,则记录下长和宽到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;
        default:
            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)));
    }

      

    ------------ 转载请注明出处 ------------
  • 相关阅读:
    AlwaysOn配置时在连接步骤时报错(35250)
    MongoDB 在系统数据库local上无法创建用户的解决方法
    Elasticsearch 安装操作手册
    SQL Server 数据库调整表中列的顺序操作
    SQL Server 数据库部分常用语句小结(二)
    一个磁盘I/O故障导致的AlwaysOn FailOver 过程梳理和分析
    他人言,以为是,铭记于此。
    MongoDB 基本操作和聚合操作
    MySQL MHA FailOver后,原Master节点自动以Slave角色加入集群的研究与实现
    SQL Sever AlwaysOn的数据同步原理
  • 原文地址:https://www.cnblogs.com/whlook/p/6476910.html
Copyright © 2020-2023  润新知