OpenCV 透视变换
本教程将讨论在 Python 中使用 OpenCV 的 getPerspectiveTransform()
和 warpPerspective()
函数查找图像的透视变换。
使用 OpenCV 的 getPerspectiveTransform()
和 warpPerspective()
函数查找图像的透视变换
图像的透视变换改变了图像的视图透视。例如,我们可以旋转和缩放给定图像中存在的某些区域或对象。
我们可以使用 OpenCV 的 getPerspectiveTransform()
和 warpPerspective()
函数来查找给定图像的对象或区域的透视变换。
getPerspectiveTransfrom()
函数用于使用图像中的一组点来查找透视变换。warPerspective()
函数将变换应用于给定的图像。
例如,让我们使用 OpenCV 的 imread()
函数读取图像,找到它的透视变换并将其与原始图像一起显示,以便使用 OpenCV 的 imshow()
函数进行比较。
请参阅下面的代码。
import cv2
import numpy as np
frame = cv2.imread('test.jpg')
pts1 = np.float32([[260, 100], [600, 100],
[260, 400], [600, 400]])
pts2 = np.float32([[0, 0], [600, 0],
[0, 600], [600, 600]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)
result = cv2.warpPerspective(frame, matrix, (600, 600))
cv2.imshow('frame', frame)
cv2.imshow('result', result)
cv2.waitKey(0)
输出:
右边是输入图像,左边是它的透视变换。我们可以看到给定图像的视图透视发生了变化。
getPerspectiveTransform()
函数的第一个输入包含我们想要转换的原始图像中的点。
第一个值用于列,第二个值用于行。函数的第二个输入包含我们要转换第一个输入点的点。
我们在上面的代码中取一小部分给定图像并将其转换为更大的图像。
这就是为什么将生成的图像放大到由 getPerspectiveTransfrom()
函数的第一个输入定义的特定区域的原因。
位置 (260,100) 的第一个点将转换为位置 (0,0)。变量 pts1
中的第二个点将转换为 pts2
变量中的第二个点。
warpPerspective()
函数的第一个参数是我们要应用变换的图像。
第二个参数是变换矩阵,第三个参数是输出图像的大小。我们还可以使用相同的函数将变换应用于视频。
我们必须使用循环读取视频的每一帧并在每一帧上应用变换。
例如,让我们使用 VideoCapture()
函数从网络摄像头捕获视频,然后使用循环读取每个图像帧,将其应用于变换,并使用 imshow 显示原始图像和生成的结果图像()
功能。
请参阅下面的代码。
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
pts1 = np.float32([[260, 100], [600, 100],
[260, 400], [600, 400]])
pts2 = np.float32([[0, 0], [600, 0],
[0, 600], [600, 600]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)
result = cv2.warpPerspective(frame, matrix, (600, 600))
cv2.imshow('frame', frame)
cv2.imshow('result', result)
if cv2.waitKey(24) == 27:
break
cap.release()
cv2.destroyAllWindows()
你可以使用网络摄像头测试代码,并在需要时更改转换点。