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