(笔记二)利用opencv调用鼠标事件在图像上绘制图形

目录


该功能主要创建一个鼠标事件发生时执行的回调函数。鼠标事件可以是任何与鼠标有关的东西,例如左键,左键,左键双击等。它给我们每个鼠标事件的坐标(x,y)。有了这个活动和地点,我们可以做任何我们喜欢的事情。

(1)查看cv2所支持的鼠标事件

opencv官网解释鼠标事件 其对以下函数有详细介绍

python 复制代码
import cv2
# 通过dir访问cv2的EVENT事件
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)

(2)通过鼠标事件在图像上做标记

代码中已经给出注释,这里就不做过多说明,具体可刨析源码

python 复制代码
# 构建一个画圆事件
# 发生鼠标事件时鼠标在图像位置的x,y坐标

def draw(event, x, y, flags, param):
    # 事件调用鼠标,双击鼠标左键
    if event == cv2.EVENT_LBUTTONDBLCLK:
        # 将鼠标双击处的坐标转为字符串
        location = '(' + str(x) + ',' + str(y) + ')'
        # 可有可无,若是想输出上述坐标即可保留
        # print(location)
        # 在鼠标点击处绘制标记
        cv2.drawMarker(img, (x, y), (255, 0, 0), cv2.MARKER_CROSS, thickness=1)
        # 在鼠标点击处绘制圆
        cv2.circle(img, (x, y), 50, (0, 255, 0), 1)
        # 在鼠标点击处显示当前图像坐标
        cv2.putText(img, location, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, [0, 0, 255], 1)


# img = np.zeros((512, 512, 3), np.uint8)
img = cv2.imread(r"D:\data\img.png")
# 创建窗口
cv2.namedWindow('draw_img')
# 将窗口与回调函数绑定
cv2.setMouseCallback('draw_img', draw)
while True:
    cv2.imshow('draw_img', img)
    # 按q结束当前窗口
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()

(3)高级操作:通过移动鼠标在图像绘制图形、曲线

代码中已经给出注释,这里就不做过多说明,具体可刨析源码

python 复制代码
# 此时为False,当鼠标产生反应时变成True
drawn = False
# 当model为True时为绘制矩形,当按下m时为绘制曲线
mode = True
ix, iy = -1, -1


# 创建回调函数


def drawing(event, x, y, flags, param):
    global ix, iy, drawn, mode
    # 按下鼠标左键时返回初始坐标
    if event == cv2.EVENT_LBUTTONDOWN:
        drawn = True
        ix, iy = x, y
    # event用于判断鼠标左键按下时并移动是绘制图形,flags用于判断鼠标是否按下了左键
    elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
        # 当鼠标移动事件为真时
        if drawn:
            # 如果没有按下m则mode为真,此时为绘制矩形
            if mode:
                # 绘制矩形
                cv2.rectangle(img, (ix, iy), (x, y), (30, 120, 0), -1)
            # 当按下m后,此时为绘制曲线
            else:
                # 绘制圆
                cv2.circle(img, (x, y), 1, (0, 255, 255), -1)
    # 当鼠标松开时,停止绘图
    elif event == cv2.EVENT_LBUTTONUP:
        drawn = False


if __name__ == '__main__':
    img = cv2.imread(r"D:\data\img.png")
    cv2.namedWindow('name window')
    cv2.setMouseCallback('name window', drawing)
    while 1:
        cv2.imshow('name window', img)
        k = cv2.waitKey(1) & 0xFF
        if k == ord('m'):
            mode = not mode
        elif k == ord('q'):
            break
    cv2.destroyAllWindows()

在图像上绘制边框矩阵

其代码和上个代码很类似,只需要调整一下

相关推荐
云原生指北4 分钟前
你的数据正在喂养 AI:从 Atlassian 公告,看科技平台的数据训练默认政策
笔记
**蓝桉**26 分钟前
容器服务学习笔记
笔记·学习
zhangrelay2 小时前
三分钟云课实践速通--模拟电子技术-模电--SimulIDE
linux·笔记·学习·ubuntu·lubuntu
木木_王2 小时前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
lkforce2 小时前
MiniMind学习笔记(三)--train_pretrain.py(预训练)
笔记·机器学习·ai·预训练·minimind·train_pretrain
OSwich2 小时前
【 Godot 4 学习笔记】数组(Array)
笔记·学习·godot
数据皮皮侠AI2 小时前
中国城市可再生能源数据集(2005-2021)|顶刊 Sci Data 11 种能源面板
大数据·人工智能·笔记·能源·1024程序员节
其实防守也摸鱼3 小时前
面试常问问题总结--护网蓝队方向
网络·笔记·安全·面试·职场和发展·护网·初级蓝队
z19408920664 小时前
Word题库转结构化:告别换行、选项与答案乱象
经验分享·笔记·语音识别
泽克5 小时前
3.4 智能化系统工程施工技术
笔记