第十七节 鼠标的操作与相应

server/2024/10/19 15:29:45/

知识点

-event代表鼠标事件类型

-EVENT_LBUTTONDOWN鼠标左键按下

-EVENT_LBUTTONUP鼠标左键抬起

-EVENT_LBUTTONMOVE鼠标及移动



Point sp(-1, -1);
Point ep(-1, -1);
Mat temp;
static void on_draw(int event, int x, int y, int flags, void* userdata)

{
    Mat image = *((Mat*)userdata);
    if (event == EVENT_LBUTTONDOWN) {--判别鼠标的当前状态;
        sp.x = x;--将当前的x,y坐标值发给sp.x,sp.y;
        sp.y = y;
        std::cout << "start point" << sp << std::endl;--输出sp的坐标;
    }
    else if (event == EVENT_LBUTTONUP) {
        ep.x = x;
        ep.y = y;
        int dx = ep.x - sp.x;
        int dy = ep.y - sp.y;
        if (dx > 0 && dy > 0) {--判别是一个有效的矩形;
            Rect box(sp.x, sp.y, dx, dy);--创建一个结构体对象box,以其实高度sp.x,sp.y以及宽度dx和高度dy来定义矩形区域
            rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);--在原图像image上绘制一个红色的(Scalar(0,0,255))线宽为2,连接方式为8,不填充的矩形;
            imshow("鼠标绘制", image);
            imshow("ROI区域", image(box));

            sp.x = -1;--如果不置为为-1,下端程序中的move条件依旧满足导致矩形移动;
            sp.y = -1;
        }
        //std::cout << "start point" << sp << std::endl;
    }

    else if (event == EVENT_MOUSEMOVE) {
        if (sp.x > 0 && sp.y > 0) {
            ep.x = x;
            ep.y = y;
            int dx = ep.x - sp.x;
            int dy = ep.y - sp.y;
            if (dx > 0 && dy > 0) {
                Rect box(sp.x, sp.y, dx, dy);
                temp.copyTo(image);--将备份的绘制图形temp复制回原始图像image,以恢复上一次的状态,避免出现移动过程中的绘制残留
                rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
                imshow("鼠标绘制", image);
            }
        }
    }
}


void QUickdemo::mouse_drawing_demo(Mat& image)
{

    namedWindow("鼠标绘制", WINDOW_FREERATIO);
    setMouseCallback("鼠标绘制", on_draw,(void*)(&image));--鼠标绘制窗口
    imshow("鼠标绘制",image);//运行直接显示图像
    temp = image.clone();创建副本


}

个人理解,如有不对,请多指正


http://www.ppmy.cn/server/123388.html

相关文章

追梦无Bug的软件世界

追梦无Bug的软件世界&#xff1a;测试人员的视角与探索 我有一个梦想&#xff0c;今天我们共同承载着一个愿景&#xff1a;创造一个没有Bug的软件世界。 我梦想有一天&#xff0c;用户将享受到完全无Bug的软件体验&#xff0c;用户不再因为软件中的Bug而感到困扰和沮丧。 我梦…

哈希知识点总结:哈希、哈希表、位图、布隆过滤器

目录 哈希 哈希表 哈希常用方法 1、直接定址法 2、存留余数法 哈希冲突 哈希冲突的解决办法 1、闭散列&#xff1a;开放定址法 &#xff08;1&#xff09;线性探测法 &#xff08;2&#xff09;二次探测法 2、开散列 哈希桶 / 拉链法 哈希的运用 位图 set操作 …

微信小程序操作蓝牙

主要流程&#xff1a; 1.初始化蓝牙适配器openBluetoothAdapter&#xff0c;如果不成功就onBluetoothAdapterStateChange监听蓝牙适配器状态变化事件 2.startBluetoothDevicesDiscovery开始搜寻附近的蓝牙外围设备 3.onBluetoothDeviceFound监听寻找到新设备的事件&#xff0c;…

《空间计量经济学:从横截面数据到空间面板》(书籍推荐)

《空间计量经济学&#xff1a;从横截面数据到空间面板》。是由荷兰格罗宁根大学经济与计量经济学系教授J保罗埃尔霍斯特撰写&#xff0c;并由中国人民大学出版社于2015年4月出版的一本重要学术著作。 该书不仅系统总结了空间计量经济学的最新发展&#xff0c;还深入探讨了从横…

论文笔记:Gradient Episodic Memory for Continual Learning

1. Contribution 提出了一组指标来评估模型在连续数据上的学习情况。这些指标不仅通过测试准确性来表征模型&#xff0c;还通过其跨任务迁移知识的能力来表征模型。针对持续学习任务&#xff0c;提出了GEM模型&#xff08;Gradient Episodic Memory&#xff09;&#xff0c;它…

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么&#xff1f;有什么限制条件&#xff1f;为什么&#xff1f;对CPU和GPU产生的影响分别是什么&#xff1f; 原理&#xff1a;Unity运行时可以将一些物体进行合并&#xff0c;从而用一个描绘调用来渲染他们&#xff0c;就是一个drawcall批次。 限…

一步一步丰富生成式语言模型系统

以下是这套生成式语言模型解决任务的流程图概述&#xff1a; #mermaid-svg-sRHDSMUMV1utrg2F {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sRHDSMUMV1utrg2F .error-icon{fill:#552222;}#mermaid-svg-sRHDSMUMV1u…

C++ -- 异常

C中的异常是用于处理程序执行过程中出现的错误情况。通过异常处理&#xff0c;程序可以在遇到错误时优雅地处理这些问题&#xff0c;而不是直接崩溃。 C语言处理错误的方式 C语言传统的处理错误的方式主要有两种&#xff1a; 终止程序&#xff1a;使用如assert这样的宏来检查…