如何使用Mouse Events绘制圆?(OpenCV Python实现)

如何使用Mouse Events绘制圆?(OpenCV Python实现)

鼠标事件有不同类型,例如左或右键点击,鼠标移动,左键双击等。 OpenCV为我们提供不同类型的鼠标事件,例如 cv2.EVENT_LBUTTONDOWN 表示鼠标左键按下, cv2.EVENT_RBUTTONDOWN 表示右键按下, cv2.EVENT_LBUTTONDBLCLK 表示左键双击等其他事件。

鼠标事件返回鼠标事件的坐标(x,y)。为了在事件发生时执行动作,我们定义了一个Mouse Callback Function。我们可以使用鼠标事件在图像上绘制圆。

步骤

要使用鼠标事件绘制圆,请按照以下步骤进行:

  • 导入所需库 OpenCV 。请确保您已经安装了它。

  • 创建一个黑色图像。我们在这个黑色图像上绘制圆。我们还使用 cv2.imread() 方法读取图像以在其上绘制圆。

  • 定义Mouse Callback Function来绘制图像上的圆。 当发生鼠标事件时,将执行Mouse Callback Function。鼠标事件会给出鼠标事件的坐标。在这里,我们定义了一个Mouse Callback Function,用于在鼠标左键按下时绘制圆。

  • 创建一个窗口,并将Mouse Callback Function绑定到此窗口。

  • 显示图像窗口。此窗口打开我们在其上绘制圆的图像。要关闭窗口,按下 ESC 按钮。

让我们查看一些程序示例,以了解其工作原理。

程序示例

在此Python程序中,我们在鼠标左键按下时绘制圆。

# 导入所需库
import cv2
import numpy as np

# 定义一个(黑色)图像,在该图像上将绘制圆
img = np.zeros((512,700,3), np.uint8)

# 定义Mouse Callback Function来绘制圆
def draw_circle(event, x, y, flags, param):
      if event == cv2.EVENT_LBUTTONDOWN:
         cv2.circle(img, (x, y), 100, (0, 255, 255), 2)

# 创建一个窗口
cv2.namedWindow("Circle Window")# 将Mouse Callback Function绑定到窗口
cv2.setMouseCallback("Circle Window", draw_circle)

# 显示图像
while True:
   cv2.imshow("Circle Window", img)
   if cv2.waitKey(20) & 0xFF == 27:
      break
cv2.destroyAllWindows()

当您执行上述Python代码时,它将打开一个名为“圆形窗口”的窗口,显示一张黑色图片。在窗口上单击鼠标左键,将绘制一个半径为100px的圆。如下所示的输出窗口,我们共绘制了五个圆。

输出

如何使用Mouse Events绘制圆?(OpenCV Python实现)

示例

在这个Python程序中,我们使用拖动鼠标画圆。绘制的圆有不同的半径。

import numpy as np
import cv2
import math
drawing = False # true if mouse is pressed
ix, iy = -1, -1

# 定义鼠标回调函数以绘制圆
def draw_circle(event, x, y, flags, param):
   global ix, iy, drawing
   if event == cv2.EVENT_LBUTTONDOWN:
      drawing = True

      # 记录鼠标位置
      ix, iy = x, y
   elif event == cv2.EVENT_MOUSEMOVE:
      drawing == True
   elif event == cv2.EVENT_LBUTTONUP:
      radius = int(math.sqrt(((ix - x) ** 2) + ((iy - y) ** 2)))
      cv2.circle(img, (ix, iy), radius, (255, 0, 255), thickness=2)
      drawing = False

# 创建一张黑色图片
img = np.zeros((512, 700, 3), np.uint8)

# 创建窗口
cv2.namedWindow('Drag Circle Window')

# 将回调函数绑定到上述定义的窗口上
cv2.setMouseCallback('Drag Circle Window', draw_circle)

# 显示图片
while True:
   cv2.imshow('Drag Circle Window', img)
   k = cv2.waitKey(1) & 0xFF
   if k == 27:
      break
cv2.destroyAllWindows()

当您执行上述Python代码时,它将打开一个显示黑色图像的窗口。我们可以通过拖动鼠标在图像上绘制一个圆。绘制圆的过程是先按下左键 (EVENT_LBUTTONDOWN) ,然后移动鼠标 (EVENT_MOUSEMOVE) ,最后释放按钮 (EVENT_LBUTTONUP)

输出

如何使用Mouse Events绘制圆?(OpenCV Python实现)

示例

在这个Python程序中,我们使用鼠标双击图像来绘制实心圆。

import numpy as np
import cv2

# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
   if event == cv2.EVENT_LBUTTONDBLCLK:
   cv2.circle(img,(x,y),100,(255,0,0),-1)

# 读入输入图片
img = cv2.imread('3D.jpg')

# 创建一个窗口
cv2.namedWindow('Filled Circle Window')

# 将回调函数绑定至窗口
cv2.setMouseCallback('Filled Circle Window', draw_circle)

# 显示图片
while True:
   cv2.imshow('Filled Circle Window', img)
   if cv2.waitKey(1) & 0xFF == 27:
      break
cv2.destroyAllWindows()

当您执行上述Python代码时,它将打开一个窗口,显示输入图片。在图片中的某点上双击(EVENT_LBUTTONDBLCLK)可画出一个填充的圆。

输出

如何使用Mouse Events绘制圆?(OpenCV Python实现)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV