使用OpenCV-Python在图像上用直线连接新点和上一个点
我们可能需要在图像上画线,用于各种目的,如画图,涂鸦,跟踪点的移动等等,因此有必要知道如何在图像处理中连接2个点。
OpenCV是一个主要用于实时计算机视觉的编程函数库。该库跨平台,并且在Apache许可下作为自由开源软件发布。
在本文中,我们将学习如何使用OpenCV-Python在图像上用直线连接新点和上一个点。
连接点与上一个点
我们的任务是将鼠标单击时当前坐标位置的图像与上一个点连接起来。
在开始连接点的步骤之前,我们应该知道如何完成。一个图像由许多像素组成,可以通过坐标来指定,我们可以在该图像上选择任意两个点,它们都会有一些坐标,通过连接这两个点,我们可以轻松绘制一条线。但是我们需要拥有这些坐标。
要在图像上的两个点之间画一条直线,我们可以使用OpenCV的 cv2.line() 方法。该方法的语法是:
cv2.line(img, pt1, pt2, color, thickness)
为了在每次鼠标点击之间绘制线条,您需要按照以下步骤进行:
步骤1:导入所需的库
第一步是导入所需的库。我们将使用OpenCV库来打开、读取和操作图像。
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:定义鼠标点击事件
下一步是定义每当鼠标在屏幕上的任何位置点击时需要执行的动作。
- 我们首先会在点列表中添加我们点击的点的坐标。
-
然后我们会创建一个小圆点来显示点击图像的位置。
-
如果我们第一次点击图像,就不需要画线。
-
但在此后,我们需要在点列表的最后两个点之间画线。然后我们会显示新的图像。
-
我们会把这个函数作为回调函数添加到鼠标事件中。
在以下代码片段中,cv2.setMouseCallback函数捕获鼠标事件,当左键按下时添加鼠标点击位置并将新点的坐标存储在点列表中。然后使用直线连接点列表中的最后两个点。
在这里,我们使用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)
步骤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库及其在图像处理中的应用。