当前位置: 首页 > article >正文

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

知识点

-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.kler.cn/a/324079.html

相关文章:

  • node对接ChatGpt的流式输出的配置
  • js像循环数组那样循环一个数字,Array.from()
  • 【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储
  • SpringBoot - Async异步处理
  • 计算机视觉 ---常见图像文件格式及其特点
  • Kafka 安装教程
  • Three.js粒子系统与特效
  • 16年408-数据结构
  • C0003.用C++开发Qt界面,针对无边框界面,实现界面可任意拖动
  • 单片机配置IO口输出模式(IO口依然可以读取电平变化)
  • 函数内部的 arguments 变量特性,属性,如何将他转换为数组
  • AVL树(平衡二叉树)的介绍以及相关构建
  • Augular 学习步骤建议
  • 并查集 (Union-Find) :从基础到优化
  • C++学习笔记(35)
  • 数组的练习
  • 域 缺省参数 函数重载 引用
  • 828华为云征文|部署基于 LLM 的私有知识库系统 AnythingLLM
  • Magnific推V2图像生成服务 可直出4K图像
  • 发掘3D文件格式的无限潜力:打造沉浸式虚拟世界
  • 数据结构:树(并查集)
  • LeetCode[中等] 138. 随机链表的复制
  • 9.28学习
  • 人工智能的基本概念与发展历程
  • 【第十四章:Sentosa_DSML社区版-机器学习之时间序列】
  • 从碎片到整合:EasyCVR平台如何重塑城市感知系统的视频数据生态