📜  使用 Python-OpenCV 在图像上用鼠标绘图(1)

📅  最后修改于: 2023-12-03 15:06:50.572000             🧑  作者: Mango

使用 Python-OpenCV 在图像上用鼠标绘图

在图像处理中,有时需要在图像上标记特定区域或对象。Python-OpenCV 提供了一个简单的方法,使用户可以使用鼠标在图像上进行绘制操作。

准备工作

首先,您需要安装 cv2numpy 模块。您可以使用以下命令安装这些模块:

pip install opencv-python
pip install numpy
绘制矩形

下面是一个使用鼠标在图像中绘制矩形的示例代码:

import numpy as np
import cv2

# 创建回调函数
def draw_rectangle(event,x,y,flags,param):
    global pt1,pt2,top_left_clicked,bottom_right_clicked

    # 获取鼠标左键按下事件
    if event == cv2.EVENT_LBUTTONDOWN:
        
        # 如果鼠标左键按下,记录左上角坐标
        if top_left_clicked == False:
            pt1 = (x,y)
            top_left_clicked = True
            
        # 如果鼠标左键按下,记录右下角坐标
        elif bottom_right_clicked == False:
            pt2 = (x,y)
            bottom_right_clicked = True

# 创建全局变量
pt1 = (0,0)
pt2 = (0,0)
top_left_clicked = False
bottom_right_clicked = False

# 连接到预设的 OpenCV 视频输入
cap = cv2.VideoCapture(0)

# 创建窗口并绑定到回调函数
cv2.namedWindow('Test')
cv2.setMouseCallback('Test',draw_rectangle)

while True:
    ret,frame = cap.read()

    # 如果两个角都已选择,绘制矩形
    if top_left_clicked == True and bottom_right_clicked == True:
        cv2.rectangle(frame,pt1,pt2,(0,0,255),3)

    # 显示绘制结果
    cv2.imshow('Test',frame)

    # 按下 Esc 键退出程序
    if cv2.waitKey(1) & 0xFF == 27:
        break

# 清理并关闭窗口
cap.release()
cv2.destroyAllWindows()

代码解释:

  • 首先定义 draw_retangle 函数,它是用来处理鼠标事件的回调函数。
  • 然后定义一些全局变量,用于存储绘制矩形时所需的坐标。
  • main 函数中,我们连接到视频输入,创建窗口并将其绑定到回调函数。
  • while 循环中,我们等待到用户绘制矩形的左上角和右下角位置。当这两个位置已经确定时,我们使用 cv2.rectangle 函数绘制矩形,并在图像上显示出来。
  • 最后,我们按下 Esc 键退出程序。
绘制圆形

下面是一个使用鼠标在图像中绘制圆形的示例代码:

import numpy as np
import cv2

# 创建回调函数
def draw_circle(event,x,y,flags,param):
    global center,clicked

    # 获取鼠标左键按下事件
    if event == cv2.EVENT_LBUTTONDOWN:
        
        # 在鼠标点击的位置创建一个圆形
        cv2.circle(img,(x,y),50,(0,255,0),2)

# 创建空白图像
img = np.zeros((512,512,3), np.uint8)

# 创建窗口并绑定到回调函数
cv2.namedWindow(winname='my_drawing')
cv2.setMouseCallback('my_drawing',draw_circle)

while True:

    # 显示当前绘制状态
    cv2.imshow('my_drawing',img)

    # 按下 Esc 键退出程序
    if cv2.waitKey(20) & 0xFF == 27:
        break

# 清理并关闭窗口
cv2.destroyAllWindows()

代码解释:

  • 首先定义 draw_circle 函数,它是用来处理鼠标事件的回调函数。
  • 然后创建一个空白图像,并将其绑定到回调函数。
  • while 循环中,我们等待用户点击鼠标,在鼠标点击的位置创建一个圆形,然后在图像上显示出来。
  • 最后,我们按下 Esc 键退出程序。
总结

以上就是使用 Python-OpenCV 在图像上用鼠标绘图的示例代码。这是一个非常有用的功能,可以帮助您在图像处理中标记特定区域或对象,并跟踪它们。