OpenCV笔记2:鼠标事件实现绘制直线、矩阵、曲线

OpenCV

鼠标事件

  1. 创建窗口
  2. 设置窗口大小
  3. 鼠标事件监听
    • 判断事件更新起始点和终点
    • 绘制线
    • 显示图片
  4. 打开背景图
"""
鼠标事件
down
up
move
"""
import cv2
import numpy as np


WINNAME = 'DRAWBOARD'
st_point = (-1, -1)
end_point = (-1, -1)


def drawLine(event, x, y, flags, param):
    global st_point, end_point
    img_copy = bg_img.copy()
    if event == cv2.EVENT_LBUTTONDOWN:
        print('EVENT_LBUTTONDOWN', event, x, y, flags, param)
        st_point = (x, y)
    if event == cv2.EVENT_MOUSEMOVE and flags:
        end_point = (x, y)
        cv2.line(img_copy, st_point, end_point, color=(0, 0, 255), thickness=2)
        cv2.imshow(WINNAME, img_copy)
    if event == cv2.EVENT_LBUTTONUP:
        print('EVENT_LBUTTONUP', event, x, y, flags, param)
        end_point = (x, y)
        # 绘制线
        # 起始点 终点
        cv2.line(bg_img, st_point, end_point, color=(0, 0, 255), thickness=2)
        cv2.imshow(WINNAME, bg_img)


def drawRectangle(event, x, y, flags, param):
    global st_point, end_point
    img_copy = bg_img.copy()
    if event == cv2.EVENT_LBUTTONDOWN:
        print('EVENT_LBUTTONDOWN', event, x, y, flags, param)
        st_point = (x, y)
    if event == cv2.EVENT_MOUSEMOVE and flags:
        end_point = (x, y)
        cv2.rectangle(img_copy, st_point, end_point, color=(0, 0, 255), thickness=2)
        cv2.imshow(WINNAME, img_copy)
    if event == cv2.EVENT_LBUTTONUP:
        print('EVENT_LBUTTONUP', event, x, y, flags, param)
        end_point = (x, y)
        # 绘制线
        # 起始点 终点
        cv2.rectangle(bg_img, st_point, end_point, color=(0, 0, 255), thickness=2)
        cv2.imshow(WINNAME, bg_img)


def drawPolylines(event, x, y, flags, param):
    global st_point, end_point
    if event == cv2.EVENT_LBUTTONDOWN:
        print('EVENT_LBUTTONDOWN', event, x, y, flags, param)
        st_point = (x, y)
        end_point = st_point
    if event == cv2.EVENT_MOUSEMOVE and flags:
        last_x, last_y = st_point, end_point
        st_point = end_point
        end_point = (x, y)
        print('EVENT_MOUSEMOVE', event, x, y, flags, param)
        pts = np.array([last_x, last_y, st_point, end_point])
        cv2.polylines(bg_img, [pts], isClosed=False, color=(0, 0, 255), thickness=2)
        cv2.imshow(WINNAME, bg_img)
    if event == cv2.EVENT_LBUTTONUP:
        print('EVENT_LBUTTONUP', event, x, y, flags, param)
        last_x, last_y = st_point, end_point
        st_point = end_point
        end_point = (x, y)
        # 绘制线
        # 起始点 终点
        pts = np.array([last_x, last_y, st_point, end_point])
        cv2.polylines(bg_img, [pts], isClosed=False, color=(0, 0, 255), thickness=2)
        cv2.imshow(WINNAME, bg_img)


def callBack(event, x, y, flags, param):
    # drawLine(event, x, y, flags, param)
    # drawRectangle(event, x, y, flags, param)
    drawPolylines(event, x, y, flags, param)


if __name__ == '__main__':
    # 创建窗口
    cv2.namedWindow(WINNAME, cv2.WINDOW_NORMAL)
    # 设置窗口大小
    cv2.resizeWindow(WINNAME, 360, 360)
    # 鼠标事件的监听
    # 参数1 事件监听的窗口名称
    # 参数2 函数名称 用于回调使用
    cv2.setMouseCallback(WINNAME, callBack, param='hello')

    # 打开背景图
    bg_img = cv2.imread('snower.jpg')
    cv2.imshow(WINNAME, bg_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

鼠标绘制直线

20240220174152_rec_.gif

鼠标绘制矩形

20240220174112_rec_.gif

鼠标绘制曲线

20240220173954_rec_.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/400230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】管道流动模拟Shader

【Unity】管道流动模拟Shader 抽象模拟管道介质流动的效果,使用顶点片元着色器。可以调整管线光泽,颜色,流动方向,透明度,流动体粗细,流动速度和横断面。 实现效果 Demo效果 Demo下载地址 管线光泽调整 …

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计,比7.8版本方便多了,有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包,解压如下,右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…

【蓝桥杯单片机入门记录】独立按键

目录 一、键盘、微动开关概述 二、按键工作原理 (1)按键构成 (2)(蓝桥杯开发板)独立按键电路图(非实际,参考理解) (3)独立按键工作原理 三、…

【J1939】一、概述,协议基础

文章目录 1. 背景2. 要点3. J1939帧细节3.1 协议数据单元(Protocol Data Unit,PDU)3.2 参数组编号(PGN)3.3 可疑参数编号(Suspect Parameter Number,SPN)参考1. 背景 J1939是一种用于商用车辆的通信协议,它定义了一套车辆电子控制单元之间进行数据通信的规范。J1939协议…

OpenAI 发布文生视频模型 Sora,普通人应该怎么做才能利益最大化?

原文链接: OpenAI 发布文生视频模型 Sora,普通人应该怎么做才能利益最大化? 自从 2022 年 11 月 30 日 ChatGPT 发布之后,每次 OpenAI 再发布新功能都跟过年一样,那叫一个热闹。 包括 GPT 4.0,GPT Store&…

滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

2024年单服务器部署Mongodb三节点副本集自动化部署脚本

该脚本是为了方便自己学习和工作中部署服务器从而节省时间进行编写,目前能正常部署,创建集群,管理员用户,以及连接都没问题,但是没有开启验证,后续找时间补充。 完整的教程请参考一下我写的技术文章。 20…

十六进制数

1.做一个收电费程序,要求输入使用的电的度数(整数)以及电费单价(实数),输出总的用电费用。 2.提示并输入一个小写字母数据,输出其对应的ASCII值,以及该小写字母对应的大写字母。 3.提…

软件测试工程师linux学习之系统层面相关命令总结

1 linux系统重启和关机的命令 重启命令:reboot 关机命令:shutdown 这两个命令一般很少用到,我们了解即可。 2 查看日志信息命令 什么是日志,日志就是一个一个普通的文本文件,文件里面记录的是软件运行过程中的信息…

市场复盘总结 20240221

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 二进三: 进级率中 33% 最常用…

搜维尔科技:用于运动科学的 OptiTrack,范围标记、步态捕捉!

OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程,为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。 对所有主要数字测力台、EMG 和模拟设备的本机即插即用支持为研究人员提供了在 Visual3D、MotionMonitor、MATLAB 和其他第三方生物力学软件包中进…

MySQL数据库基础(十二):子查询(三步走)

文章目录 子查询(三步走) 一、子查询(嵌套查询)的介绍 二、子查询的使用 三、总结 子查询(三步走) 一、子查询(嵌套查询)的介绍 在一个 select 语句中,嵌入了另外一个 select …

如何使用Coded UI Test对Webpage进行自动化测试

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

2024 年了,如何 0 基础开始学习 Vue ?

最近 5 个月,我都在忙着构建我的第一开源项目 HexoPress,这个项目是使用 Electron Vue 3 TypeScript 等技术实现的,一方面,我真的很需要一款合自己心意的博客编辑器,另一方面,我也是真心想学习 Electron …

App Inventor 2 Activity启动器技巧:如何查看并启动其他App

App包名和类名的查看 由 App Inventor 2 创建的应用要弄清包名和类名,可通过下载其应用程序的源代码,然后使用文件资源管理器或解压缩程序解压 .aia源文件(文件的扩展名修改成.zip 或.rar,然后解压),在解压…

Redis面试题及核心知识点讲解

redis是单线程还是多线程? redis是单线程的,主要是指网络I/O线程。Redis的持久化,集群同步等操作,则由另外的线程来执行。 2 . redis是单线程,为什么处理这么快? Redis的大部分操作都是在内存中完成。单线…

电脑进水无法开机怎么办 电脑进水开不了机的解决方法

意外总是会不定时打破你的计划,电脑这类电器最怕遇到的除了火还有水,设备进水会导致数据丢失,那么我们遇到电脑进水怎么办?进水之后不正确处理也会引起很多不必要的麻烦. 解决办法 第一步:关机 如果您的电脑是在开…

山西电力市场日前价格预测【2024-02-22】

日前价格预测 预测说明: 如上图所示,预测明日(2024-02-22)山西电力市场全天平均日前电价为441.87元/MWh。其中,最高日前电价为680.73元/MWh,预计出现在18:45。最低日前电价为352.02元/MWh,预计…

【git 使用】git 中head、工作树、和索引分别是什么,有什么关系和区别

HEAD 定义:HEAD 是指向当前所在分支(或者是某个特定的提交)的指针,它表示当前工作目录正在处于哪个提交或分支上。作用:HEAD 指示了当前工作目录的状态,可以通过 HEAD 来确定当前处于哪个分支上&#xff0…

正交匹配追踪算法(Orthogonal Matching Pursuit)实现过程及Python模拟

正交匹配追踪(Orthogonal Matching Pursuit,OMP)是一种用于寻找稀疏信号的贪婪算法,用于求解压缩感知问题中的稀疏近似问题。在压缩感知的背景下,通常我们有一个欠定的线性系统Ax y,其中A是一个已知的测量…