OpenCV学习(三)——响应鼠标事件(获取点击点坐标和颜色,利用鼠标进行绘图)

news2024/9/24 0:56:07

响应鼠标事件

    • 3. 响应鼠标事件
      • 3.1 获取鼠标点击的坐标
      • 3.2 获取鼠标点击像素点的颜色
      • 3.3 在鼠标点击的位置生成圆
      • 3.4 通过拖动鼠标来绘制填充矩形
      • 3.5 通过拖动鼠标绘制未填充矩形
      • 3.6 使用鼠标选点绘制多边形
      • 3.7 按住鼠标左键进行绘图

3. 响应鼠标事件

使用OpenCV读取图像,可以在读取图像的窗口通过鼠标点击可以实现:获取鼠标点击像素点的坐标、获取鼠标点击像素点的颜色和在鼠标点击的像素点生成圆等等。

# 对窗口的鼠标动作做出回应
cv2.setMouseCallback(winname, callback, userdata)
  • winname:窗口的名字
  • callback:回调函数
  • userdata:给回调函数的参数
# 鼠标回调函数,传入到callback参数上去
def mouse_callback(event, x, y, flags, userdata)
  • enent:鼠标事件
  • x:横坐标
  • y:纵坐标
  • flags:事件组合
  • userdata:与cv2.setMouseCallback中的userdata对应,用于传参
鼠标事件event对应
EVENT_MOUSEMOVE鼠标移动
EVENT_LBUTTONDOWN按下鼠标左键
EVENT_RBUTTONDOWN按下鼠标右键
EVENT_LBUTTONUP左键释放
EVENT_RBUTTONUP右键释放
EVENT_LBUTTONDBLCLK左键双击
EVENT_RBUTTONDBLCLK右键双击

3.1 获取鼠标点击的坐标

import cv2
import numpy as np


# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):
    # 如果鼠标左键点击,则输出横坐标和纵坐标
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f'({x}, {y})')

        # 在图像上绘制点
        cv2.circle(img, (x, y), 3, (0, 0, 255), -1)

        # 在图像上添加坐标文本
        # (图像,文本内容,坐标点,字体类型,字体大小,颜色,字体粗细)
        cv2.putText(img, f'({x},{y})', (x, y),
            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

        # 获取指定像素点的颜色
        pixel_color = img[x, y]
        print("颜色值BGR:", pixel_color)


img = cv2.imread('lena.jpg')

# 创建窗口
cv2.namedWindow('Point Coordinates')

# 将回调函数绑定到窗口
cv2.setMouseCallback('Point Coordinates', mouse_callback)

# 显示图像
while True:
    cv2.imshow('Point Coordinates', img)
    k = cv2.waitKey(1) & 0xFF
    # 按esc键退出
    if k == 27:
        break
cv2.destroyAllWindows()

3.2 获取鼠标点击像素点的颜色

# 获取指定像素点的颜色
pixel_color = img[x, y]
print("颜色值BGR:", pixel_color)

请添加图片描述

3.3 在鼠标点击的位置生成圆

import cv2

img = cv2.imread('lena.jpg')


# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):
    # 如果鼠标左键点击,则输出横坐标和纵坐标
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f'({x}, {y})')

        # 在图像上绘制圆
        cv2.circle(img, (x, y), 100, (0, 0, 255), -1)


# 创建新窗口
cv2.namedWindow('mouse')

# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)

while True:
    cv2.imshow('mouse', img)
    k = cv2.waitKey(1) & 0xFF
    # 按esc键退出
    if k == 27:
        break
cv2.destroyAllWindows()

请添加图片描述

3.4 通过拖动鼠标来绘制填充矩形

在用QQ截图的时候,会有绘制矩形框的选项,使用OpenCV来进行模拟

思路:

  1. 鼠标左键点击开始进行绘制
  2. 鼠标未拖动则生成圆点
  3. 鼠标拖动则绘制矩形
  4. 最后在图像上生成矩形框

可用到的event事件:

  • EVENT_LBUTTONDOWN:按下鼠标左键
  • EVENT_MOUSEMOVE:鼠标移动
  • EVENT_LBUTTONUP:左键释放
import cv2
import numpy as np

img = cv2.imread('lena.jpg')

drawing = False # 如果按下鼠标,则为真
start_x, start_y = -1, -1


# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):
    global start_x, start_y, drawing
    # 鼠标左键单击
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        start_x, start_y = x, y

    # 鼠标移动
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            cv2.rectangle(img, (start_x, start_y), (x, y), (0, 0, 255), -1)

    # 鼠标左键松开
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
       
    
# 创建新窗口
cv2.namedWindow('mouse')

# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)

while True:
    cv2.imshow('mouse', img)
    k = cv2.waitKey(1) & 0xFF
    # 按esc键退出
    if k == 27:
        break
cv2.destroyAllWindows()

请添加图片描述

3.5 通过拖动鼠标绘制未填充矩形

import cv2
import numpy as np

img = cv2.imread('lena.jpg')

drawing = False # 如果按下鼠标,则为真
start_x, start_y = -1, -1


# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):
    global start_x, start_y, drawing
    # 鼠标左键单击
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        start_x, start_y = x, y

    # 鼠标移动
    elif event == cv2.EVENT_MOUSEMOVE:
        pass

    # 鼠标左键松开
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.rectangle(img, (start_x, start_y), (x, y), (0, 0, 255), 3)
       

# 创建新窗口
cv2.namedWindow('mouse')

# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)

while True:
    cv2.imshow('mouse', img)
    k = cv2.waitKey(1) & 0xFF
    # 按esc键退出
    if k == 27:
        break
cv2.destroyAllWindows()

请添加图片描述

3.6 使用鼠标选点绘制多边形

import cv2
import numpy as np

img = cv2.imread('lena.jpg')

xys = []


# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):
    global xys, img
    # 鼠标左键单击
    if event == cv2.EVENT_LBUTTONDOWN:
        xys.append([x, y])
        cv2.circle(img, (x, y), 5, (0, 0, 255), -1)

    # 鼠标右键单击
    elif event == cv2.EVENT_RBUTTONDOWN:
        pts = np.array(xys, np.int32)
        # 画多条线:(图像,点集合,是否闭合,颜色,粗细)
        cv2.polylines(img, [pts], True, (0, 0, 0), 2)
        xys = []


# 创建新窗口
cv2.namedWindow('mouse')

# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)

while True:
    cv2.imshow('mouse', img)
    k = cv2.waitKey(1) & 0xFF
    # 按esc键退出
    if k == 27:
        break
cv2.destroyAllWindows()

按照鼠标选点的先后位置绘制多边形
请添加图片描述
如果相同选点,但顺序不同,绘制的图像也不同
请添加图片描述

3.7 按住鼠标左键进行绘图

可以想象成绘图工具中的橡皮擦操作

import cv2
import numpy as np

img = cv2.imread('lena.jpg')

drawing = False # 按下鼠标左键响应


# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):
    global drawing
    # 鼠标左键单击
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True

    # 鼠标移动
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            cv2.circle(img, (x, y), 5, (255, 255, 255), -1)

    # 鼠标左键释放
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False



# 创建新窗口
cv2.namedWindow('mouse')

# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)

while True:
    cv2.imshow('mouse', img)
    k = cv2.waitKey(1) & 0xFF
    # 按esc键退出
    if k == 27:
        break
cv2.destroyAllWindows()

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年第四届MathorCup大数据挑战赛(B题)|电商零售商家需求预测及库存优化问题|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 希望这些想法对大家的做题有一定的启发和借鉴意义。 让我们来…

python接口自动化测试

写在前面的话: 这个是我实际工作中写的项目,主要用来备注和后期查看~~大家可以参考学习,但是请不要用于其他不好的途径~~ 准备工作: 先下载HTMLTestRunner.py 下载地址:HTMLTestRunner - tungwaiyips software 参考&a…

框架安全-CVE 复现SpringStrutsLaravelThinkPHP漏洞复现

目录 服务攻防-框架安全&CVE 复现&Spring&Struts&Laravel&ThinkPHP概述PHP-开发框架安全-Thinkphp&Laravel漏洞复现Thinkphp-3.X RCEThinkphp-5.X RCELaravel框架安全问题- CVE-2021-3129 RCE JAVAWEB-开发框架安全-Spring&Struts2Struts2框架安全…

【MATLAB源码-第59期】基于matlab的QPSK,16QAM164QAM等调制方式误码率对比,调制解调函数均是手动实现未调用内置函数。

操作环境: MATLAB 2022a 1、算法描述 正交幅度调制(QAM,Quadrature Amplitude Modulation)是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度(π/2)的正弦波,因此…

Python中的*args 和 **kwargs

在Python中的代码中经常会见到这两个词 args 和 kwargs,前面通常还会加上一个或者两个星号。其实这只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数;kwargs 是 keyword arguments 的缩写,表示关键字…

【优选算法系列】第一节.双指针(283. 移动零和1089. 复写零)

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:优选算法系列 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff01…

暄桐推荐|学书法的必读书目

在暄桐教室,写字之外,读书、静坐也是桐学们修习的功课。今天,便向你推荐,关于学习书法,暄桐教室的那些必读书目:    暄桐推荐学书法必读书之初阶书目:      对零基础的小白同学或刚入门…

VSCode远程连接

1 VSCode 远程连接服务器 1、下载vscode 百度搜索vscode(注意不是visual studio),进入vscode官网进行下载。 2、安装ssh插件 根据你的操作系统选择对应的版本进行下载和安装。 安装完成之后,启动vscode,选择左侧Exten…

使用 Visual Studio Code 编写 TypeScript程序

安装 TypeScript 首先,确保你已经安装了 TypeScript,如果没有安装,请参考https://blog.csdn.net/David_house/article/details/134077973?spm1001.2014.3001.5502进行安装 创建 新建一个文件夹,用vs code打开,在文…

SpringBoot 集成 kaptcha 验证码

简介 这里就一句话说明了哈,并能找到这里,都是知道这个是要干嘛的了。kaptcha 是谷歌开源的简单实用的验证码生成工具。 项目源码 项目工程源码路径,点击这里, 可以结合源码来看。 项目搭建 项目工程截图 第一步:…

vue使用Element-plus的Image预览时样式崩乱

🔥博客主页: 破浪前进 🔖系列专栏: Vue、React、PHP ❤️感谢大家点赞👍收藏⭐评论✍️ 问题: 在使用组件库的image时出现了点小问题,预览的图片层级反而没有表格的层级高 效果图:…

FL Studio21最新中文汉化解锁版,2024怎么激活FL Studio

FL Studio2024最新中文汉化解锁版是一款功能强大的数字音频工作站(DAW),它广泛应用于音乐创作和音乐制作领域。在使用FL Studio时,购买正版软件是否有必要呢?本文将详细探讨FL Studio的功能特点以及正版软件的重要性。…

【C++那些事儿】内联函数,auto,以及C++中的空指针nullptr

君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,我之前看过一套书叫做《明朝那些事儿》,把本来枯燥的历史讲的生动有趣。而C作为一门接近底层的语言,无疑是抽象且难度颇…

【电路笔记】-电路中的复数与相量(Phasor)

电路中的复数与相量(Phasor) 文章目录 电路中的复数与相量(Phasor)1、概述2、复数定义3、复数计算规则4、电子领域的复数5、总结 复数是一种重要的数学工具,广泛应用于包括电子学在内的许多物理领域。 这个概念可能看起来很奇怪,但它们的操作很简单&…

鸡尾酒学习——薄荷夏日

1、材料:冰块(或者雪莲)、牛奶、朗姆酒、绿薄荷糖浆; 2、口感:有点像是再吃薄荷奶糖口味的酒心奶糖。 3、视觉效果:白色加上一点点绿色; 4、步骤: (1)向摇壶内…

如何使用react-router v6快速搭建路由?

前言 之前一直使用react-router V5,上次搭建一个小项目,下载的react-router V6, 本以为没什么区别,就按照v5的那一套用了,区区小功能,奈何不了我的。然后自信满满的运行,哦豁,不生效…

foo = foo || bar 的深入解析

目录 前言 用法 代码示例 理解 注意点 结论 前言 在JavaScript中,foo foo || bar 是一种常见的编程模式,用于设置变量的默认值或者确保变量被赋值。这种写法利用了JavaScript中逻辑运算符的短路特性,即在逻辑运算中,一旦结…

docker - window Docker Desktop升级

文章目录 前言docker - window Docker Desktop升级 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来…

通过el-tree 懒加载树,创建国家地区四级树

全国四级行政地区树数据库sql下载路径:【免费】全国四级地区(省市县)数据表sql资源-CSDN文库https://download.csdn.net/download/weixin_51722520/88469807?spm1001.2014.3001.5503 我在后台获取地区信息添加了限制,只获取parentid为当前的地…