使用 Python-OpenCV 在图像上用鼠标绘图
OpenCV 是一个用于计算机视觉、机器学习和图像处理的大型开源库。 OpenCV 支持多种编程语言,如Python、C++、 Java等。它可以处理图像和视频以识别物体、面部,甚至是人类的笔迹。在本文中,我们将尝试在鼠标的帮助下绘制图像。在学习如何使用鼠标在图像上绘图之前,我们需要了解什么是回调。<
打回来
编程中的回调意味着在进程完成时调用此函数(回调)。这同样适用于一般的面向事件的编程。单击鼠标按钮(事件)时,调用函数。我们不知道何时单击该按钮。我们所能做的就是告诉按钮“给我回电”或在单击鼠标按钮时调用此函数。
鼠标回调
当用户使用鼠标执行操作时,可能会发生回调;此操作通常称为事件。鼠标只有一个回调,即setMouseCallback() ,所有鼠标操作都只会调用此函数。
我们可以有条件块来根据使用鼠标执行的事件/操作来执行某些事情。鼠标事件/操作可能是:
- EVENT_MOUSEMOVE
- EVENT_LBUTTONDOWN
- EVENT_RBUTTONDOWN
- EVENT_LBUTTONUP
- EVENT_RBUTTONUP
这个回调应该在什么时候发生:
我们希望只有当我们在弹出窗口上使用鼠标时才能回调这个回调,弹出窗口的标题是“弹出窗口的标题”。
cv2.namedWindow("Title of Popup Window")
示例 1:当我们使用 OpenCV 左键单击弹出窗口时绘制圆形:
import cv2
img = cv2.imread("flower.jpg")
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print("hello")
cv2.circle(img, (x, y), 100, (0, 255, 0), -1)
cv2.namedWindow(winname = "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", draw_circle)
while True:
cv2.imshow("Title of Popup Window", img)
if cv2.waitKey(10) & 0xFF == 27:
break
cv2.destroyAllWindows()
输出:
示例 2:使用 OpenCV 在图像上拖动绘制一个矩形
import cv2
img = cv2.imread("flower.jpg")
# variables
ix = -1
iy = -1
drawing = False
def draw_rectangle_with_drag(event, x, y, flags, param):
global ix, iy, drawing, img
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix = x
iy = y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
cv2.rectangle(img, pt1 =(ix, iy),
pt2 =(x, y),
color =(0, 255, 255),
thickness =-1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.rectangle(img, pt1 =(ix, iy),
pt2 =(x, y),
color =(0, 255, 255),
thickness =-1)
cv2.namedWindow(winname = "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window",
draw_rectangle_with_drag)
while True:
cv2.imshow("Title of Popup Window", img)
if cv2.waitKey(10) == 27:
break
cv2.destroyAllWindows()
输出:
(cv2.waitKey(10) & 0xFF == 27) 做什么?
cv2.waitKey() 返回一个 32 位整数值(可能取决于平台)。键输入是 ASCII 码,它是一个 8 位整数值。因此,您只关心这 8 位,并希望所有其他位为 0。您可以通过以下方式实现: cv2.waitKey(10) & 0xFF == 27