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的圆。请参见以下输出窗口,我们绘制了五个圆。
输出
示例
在这个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) 。
输出
示例
在这个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)图像中的一个点。