在OpenCV-Python中,将新点连接到图像上的前一个点上
有时我们需要在图像上画线,如绘图、涂鸦、跟踪点的移动等,因此需要知道如何在图像处理中连接2个点。
OpenCV 是一种专为实时计算机视觉而设计的函数库。该函数库跨平台,根据 Apache 许可证,是免费开源软件。
本文将介绍如何使用 OpenCV-Python 将新点连接到图像上的前一个点上,以直线形式呈现。
将点连接到前一个点上
我们的任务是将鼠标单击所执行的当前坐标位置与前一个点连接。
在开始连接点的步骤之前,我们应该了解如何进行连接。图像由许多像素组成,可以通过坐标指定。我们可以选择此图像上的任意 2 个点,它们都将具有一些坐标。通过连接这 2 个点,我们可以轻松地绘制一条线。但是我们需要将这些坐标记录下来。
要在图像上的两个点之间绘制一条直线,我们可以使用 OpenCV cv2.line()。此方法的语法为:
cv2.line(img, pt1, pt2, color, thickness)
要在每次单击鼠标时在其中绘制线,请按照以下步骤操作:
步骤 1:导入所需库
第一步是导入所需的库。为了打开、读取和操作图像,我们将使用 Open CV 库。
import cv2
import numpy as np
步骤 2:读取图像
我们可以使用 cv2.imread() 函数从文件中读取图像。在下面的代码段中,我们从文件中读取了图像,并使用 cv2.imshow 函数显示了它。
# 读取图像
img = cv2.imread('image.jpg')
# 显示图像
cv2.imshow('Image', img)
cv2.waitKey(0)
步骤 3:声明包含所有点的列表
为了跟踪所有访问的点,我们将创建一个列表,其中我们将附加我们在图像上单击鼠标的所有点。
Point = []
步骤 4:定义鼠标单击事件
接下来的步骤是定义每当鼠标在屏幕上的任何位置被单击时需要执行的操作。
- 我们将首先将我们单击的点的坐标添加到点列表中。
- 然后,我们将创建一个小点以显示我们单击图像的点。
- 如果我们第一次单击图像,则不需要绘制线条。
- 但是之后,我们需要在点列表中的最后 2 个点之间绘制一条线。然后,我们将显示新图像。
- 我们将此函数添加为鼠标事件的回调函数。
在以下代码段中,cv2.setMouseCallback 函数捕获鼠标事件,然后在单击左键时将鼠标单击的位置添加到鼠标单击的位置,并将新点的坐标存储在点列表中。然后,使用直线连接点列表中最后 2 个可用点。
这里我们使用 cv2.line() 函数在前一个点和新点之间绘制一条线。该函数以两个点的坐标以及线的颜色和厚度作为输入。然后,我们使用 cv2.imshow 函数显示带有线的图像。
# 定义一个回调函数来捕获鼠标事件
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)
# 设置鼠标事件的回调函数
cv2.setMouseCallback('Image', mouse_callback)
# 等待用户单击图像
cv2.waitKey(0)
步骤5:关闭所有窗口
最后,我们需要使用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库及其在图像处理中的应用。