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

2025年4月11日 | 阅读 4 分钟

引言

使用 Python 和 OpenCV 在图像上进行鼠标绘图是一种研究计算机视觉和 GUI 功能的有用且引人入胜的方法。借助 OpenCV,一个强大的图像处理框架,用户可以设计独特的交互式应用程序,包括创意效果、形状绘制和图像标注。由于它允许用户通过鼠标事件(如单击和拖动)与图像进行动态交互,因此它是教育项目、交互式艺术和基于图像的应用程序用户界面元素的原型设计的理想工具。

通常,该过程包括创建对特定事件(例如鼠标左键单击、移动和释放)做出反应的鼠标回调方法,并根据光标位置创建形状。用户只需几行代码就可以绘制圆形、矩形或自由手画线等对象,记录鼠标事件,并构建一个窗口来显示图像。除了提高用户参与度之外,此功能还为更复杂的 Python 图像处理任务奠定了基础。

OpenCV 是一个庞大的开源库,用于图像处理、机器学习和计算机视觉。OpenCV 支持多种编程语言,包括 Python、C++Java 等。通过处理图像和视频,它可以识别面部、对象甚至人类手写体。在本文中,我们将尝试使用鼠标在图像上进行绘制。在学习如何使用鼠标在图像上进行绘制之前,我们必须首先理解什么是回调。

回调

在编程中,回调是进程完成后被调用的函数。这同样适用于通常面向事件的编程。当按下鼠标按钮(一个事件)时,调用一个函数。我们不知道按钮何时会被按下。我们只能指示按钮“回调我”或在单击鼠标按钮时调用此函数。

鼠标回调

当用户使用鼠标执行一个动作(通常称为事件)时,可能会发生回调。对于鼠标,只有一个回调函数 setMouseCallback(),它会被每一个鼠标动作调用。

我们可以利用条件块来根据使用鼠标执行的事件或动作执行某些操作。鼠标动作或事件可能是:

  • EVENT_MOUSEMOVE
  • EVENT_LBUTTONDOWN
  • EVENT_RBUTTONDOWN
  • EVENT_LBUTTONUP
  • EVENT_RBUTTONUP

何时应该发生此回调?

只有当我们使用鼠标在标题为“弹出窗口标题”的弹出窗口上操作时,我们才希望此回调发生。

示例 1:使用 OpenCV 在弹出窗口上左键单击时绘制圆形

说明

当按下鼠标左键时,此代码将创建一个图像窗口,并在鼠标单击点绘制一个绿色的圆。当按下“Esc”键时,窗口关闭。

输出

Drawing with Mouse on Images using Python-OpenCV

示例 2:使用 OpenCV 通过拖动在图像上绘制矩形

说明

然后使用此代码,用户可以在窗口中的图像上通过单击并拖动鼠标来创建矩形。最后,创建的矩形将被绘制在原始图像上,并且绘制将持续实时显示,直到释放鼠标按钮。

输出

Drawing with Mouse on Images using Python-OpenCV

cv2.waitKey(10) & 0xFF == 27 的作用是什么?

cv2.waitKey() 返回的 32 位整数值可能因平台而异。按键输入是 ASCII 格式的 8 位整数值。您希望所有其他位都为零,并且只关心这八位。您可以通过使用 cv2.waitKey(10) & 0xFF == 27 来实现此目的。