OpenCV Python 如何使用鼠标事件绘制圆

OpenCV Python 如何使用鼠标事件绘制圆

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

鼠标事件返回鼠标事件的坐标(x,y)。为了在事件发生时执行操作,我们定义一个鼠标 回调函数。 我们使用鼠标事件来在图像上绘制圆圈。

步骤

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

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

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

  • 定义一个鼠标 回调函数 来在图像上绘制圆圈。当发生鼠标事件时,鼠标 回调函数 会被执行。鼠标事件给出了鼠标事件的坐标。在这里,我们定义了一个鼠标 回调函数 来在鼠标左键按下时绘制圆圈。

  • 创建一个窗口并将鼠标 回调函数 绑定到该窗口。

  • 显示图像窗口。该窗口打开我们绘制圆圈的图像。要关闭窗口,按下 esc 按钮。

让我们看一些示例程序来了解它的工作原理。

示例

在这个Python程序中,当鼠标左键被按下时,我们绘制圆圈。

# Import required libraries
import cv2
import numpy as np

# define an image (black) on which the circle to be drawn
img = np.zeros((512,700,3), np.uint8)

# define mouse callback function to draw circle
def draw_circle(event, x, y, flags, param):
      if event == cv2.EVENT_LBUTTONDOWN:
         cv2.circle(img, (x, y), 100, (0, 255, 255), 2)

# Create a window
cv2.namedWindow("Circle Window")

# bind the callback function to the window
cv2.setMouseCallback("Circle Window", draw_circle)

# display the image
while True:
   cv2.imshow("Circle Window", img)
   if cv2.waitKey(20) & 0xFF == 27:
      break
cv2.destroyAllWindows()

当您执行上述Python代码时,它将打开一个名为“Circle Window”的窗口,显示一个黑色图像。在窗口上点击鼠标左键时,将会绘制一个半径为100px的圆。请参见以下输出窗口,我们绘制了五个圆。

输出

OpenCV Python 如何使用鼠标事件绘制圆

示例

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

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

# define mouse callback function to draw circle
def draw_circle(event, x, y, flags, param):
   global ix, iy, drawing
   if event == cv2.EVENT_LBUTTONDOWN:
      drawing = True

      # we take note of where that mouse was located
      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

# Create a black image
img = np.zeros((512, 700, 3), np.uint8)

# Create a window
cv2.namedWindow('Drag Circle Window')

# bind the callback function to above defined window
cv2.setMouseCallback('Drag Circle Window', draw_circle)

# display the image
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)

输出

OpenCV Python 如何使用鼠标事件绘制圆

示例

在这个Python程序中,我们使用鼠标双击在输入图片上绘制了实心圆。

import numpy as np
import cv2

# mouse callback function
def draw_circle(event,x,y,flags,param):
   if event == cv2.EVENT_LBUTTONDBLCLK:
   cv2.circle(img,(x,y),100,(255,0,0),-1)

# read the input image
img = cv2.imread('3D.jpg')

# Create a window
cv2.namedWindow('Filled Circle Window')

# bind the callback function to window
cv2.setMouseCallback('Filled Circle Window', draw_circle)

# display the image
while True:
   cv2.imshow('Filled Circle Window', img)
   if cv2.waitKey(1) & 0xFF == 27:
      break
cv2.destroyAllWindows()

当您执行上面的Python代码时,它将打开一个显示输入图像的窗口。要在图像中绘制一个填充圆,双击(EVENT_LBUTTONDBLCLK)图像中的一个点。

输出

OpenCV Python 如何使用鼠标事件绘制圆

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程