在 OpenCV-Python 中使用直线连接图像上新点到前一点


我们可能需要出于各种目的在图像上绘制线条,例如绘图、涂鸦、跟踪点的移动等,因此有必要了解如何在图像处理中连接两个点。

OpenCV 是一个主要用于实时计算机视觉的编程函数库。该库是跨平台的,并根据 Apache 许可证获得免费和开源软件许可。

在本文中,我们将学习如何使用 OpenCV-Python 在图像上使用直线连接新点到前一点。

连接前一点上的点

我们的任务是将图像上鼠标点击的当前坐标位置与前一点连接起来。

在开始连接点的步骤之前,我们应该知道我们将如何做到这一点。图像由许多像素组成,这些像素可以通过坐标指定,我们可以在此图像上选择任意两个点,它们都将具有一些坐标,通过连接这两个点,我们可以轻松地绘制一条线。但我们需要拥有这些坐标。

为了在图像上的两个点之间绘制直线,我们可以使用 OpenCV 的 **cv2.line()** 函数。此方法的语法如下:

cv2.line(img, pt1, pt2, color, thickness)

要在每次鼠标点击之间绘制线条,您需要按照以下步骤操作:

步骤 1:导入所需的库

第一步是导入所需的库。为了打开、读取和操作图像,我们将使用 Open CV 库。

import cv2
import numpy as np

步骤 2:读取图像

我们可以使用 **cv2.imread()** 函数从文件读取图像。在以下代码片段中,我们从文件读取了一个图像,并使用 cv2.imshow 函数显示它。

# Read the image
img = cv2.imread('image.jpg')

# Display the image
cv2.imshow('Image', img)
cv2.waitKey(0)

步骤 3:声明一个包含所有点的列表

为了跟踪所有访问过的点,我们将创建一个列表,在其中我们将附加我们在图像上点击鼠标的所有点。

Point = []

步骤 4:定义鼠标点击事件

下一步是定义每当鼠标在屏幕上的任何位置点击时我们需要执行的操作。

  • 我们首先将我们点击的点的坐标添加到 points 列表中。

  • 然后,我们将创建一个小的点来显示我们点击图像的位置。

  • 如果我们第一次点击图像,则无需绘制线条。

  • 但之后我们需要在 points 列表中的最后两个点之间绘制一条线。然后我们将显示新图像。

  • 我们将此函数作为回调添加到鼠标事件中。

在以下代码片段中,cv2.setMouseCallback 函数捕获鼠标事件,然后在按下鼠标左键时附加鼠标点击的位置,并将新点的坐标存储在 points 列表中。然后,使用直线连接 points 列表中最后两个可用的点。

这里我们使用了 **cv2.line()** 函数在先前点和新点之间绘制一条线。该函数将两个点的坐标以及线条的颜色和粗细作为输入。然后,我们使用 cv2.imshow 函数显示带有线条的图像。

# Define a callback function to capture mouse events
def mouse_callback(event, x, y, flags, param):
   if event == cv2.EVENT_LBUTTONDOWN:
      points.append((x,y))
      cv2.circle(img,(x,y), 1, (100, 100, 100), -1)
      if len(points) >= 2:
         cv2.line(img, points[-1], points[-2], (0, 0, 10), 2)
      cv2.imshow('image', img)
      
# Set the callback function for mouse events
cv2.setMouseCallback('Image', mouse_callback)

# Wait for the user to click on the image
cv2.waitKey(0)

步骤 6:关闭所有窗口

最后,我们需要使用 destroyAllWindows() 函数销毁所有窗口:

Cv2.destroyAllWindows()

示例

以下是使用 OpenCV-Python 在图像上使用直线连接新点到前点的完整代码:

import cv2
import numpy as np
img = cv2.imread('image5.jpg')
cv2.imshow('image',img)
points = []
def click_event(event, x, y, flags, params):
   if event == cv2.EVENT_LBUTTONDOWN:
      points.append((x,y))
      cv2.circle(img,(x,y), 1, (100, 100, 100), -1)
      if len(points) >= 2:
         cv2.line(img, points[-1], points[-2], (0, 0, 10), 2)
         cv2.imshow('image', img)
cv2.setMouseCallback('image', click_event)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出

结论

在本文中,我们了解了如何使用 Python 语言的 OpenCV 库在图像上使用直线连接新点到前一点。我们介绍了读取图像、定义前一点和新点,然后使用直线连接这些点所需的所有步骤。我们了解了 Python 的 Opencv 库及其在图像处理中的应用。

更新于: 2023年4月20日

937 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始
广告