Trasformazione prospettica in OPENCV PYTHON
Sto cercando di eseguire una trasformazione prospettica di un sudoku. La trasformazione prevista sta avvenendo solo sul lato sinistro. Per favore aiutami sottolineando il mio errore.
Immagine in ingresso:
Immagine di output prevista:
L'output che sto ottenendo:
Gli angoli del sudoku trovato utilizzando cv2.approxpolydp () sono i seguenti:
top_left = [71,62]
top_right = [59, 418]
bottom_right = [443, 442]
bottom_left = [438, 29]
La forma dell'immagine in uscita è [300,300].
Le coordinate di output corrispondenti sono:
output_top_left = [0,0]
output_top_right = [0, 299]
output_bottom_right = [299, 299]
output_bottom_left = [299,0]
Quello che segue è il codice che ho usato per la trasformazione della prospettiva:
#corners = [[71,62], [59, 418], [443, 442], [438, 29]]
new = np.float32([[0,0], [0,299], [299,299], [299,0]])
M = cv2.getPerspectiveTransform(np.float32(corners), new)
dst = cv2.warpPerspective(gray, M, (300,300))
La matrice di trasformazione generata è:
[[ 9.84584842e-01 3.31882531e-02 -7.19631955e+01]
[ 8.23993265e-02 9.16380389e-01 -6.26659363e+01]
[ 4.58051741e-04 1.45318012e-04 1.00000000e+00]]
Risposte
Hai le coordinate X, Y invertite. Python / OpenCV li richiede elencati come X, Y (anche se li definisci come valori numpy). L'array che devi specificare per getPerspectiveTransform deve elencarli come X, Y.
Ingresso:
import numpy as np
import cv2
# read input
img = cv2.imread("sudoku.jpg")
# specify desired output size
width = 350
height = 350
# specify conjugate x,y coordinates (not y,x)
input = np.float32([[62,71], [418,59], [442,443], [29,438]])
output = np.float32([[0,0], [width-1,0], [width-1,height-1], [0,height-1]])
# compute perspective matrix
matrix = cv2.getPerspectiveTransform(input,output)
print(matrix.shape)
print(matrix)
# do perspective transformation setting area outside input to black
imgOutput = cv2.warpPerspective(img, matrix, (width,height), cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))
print(imgOutput.shape)
# save the warped output
cv2.imwrite("sudoku_warped.jpg", imgOutput)
# show the result
cv2.imshow("result", imgOutput)
cv2.waitKey(0)
cv2.destroyAllWindows()
Risultati: