OpenCV 透视变换

Ammar Ali 2024年2月15日
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()

你可以使用网络摄像头测试代码,并在需要时更改转换点。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - OpenCV Image