Transformation de perspective dans OPENCV PYTHON
J'essaye de réaliser une transformation de perspective d'un puzzle de sudoku. La transformation attendue ne se produit que sur le côté gauche. S'il vous plaît, aidez-moi en signalant mon erreur.
Image d'entrée:
Image de sortie attendue:
Le résultat que j'obtiens:
Les coins du puzzle sudoku trouvés en utilisant cv2.approxpolydp () sont les suivants:
top_left = [71,62]
top_right = [59, 418]
bottom_right = [443, 442]
bottom_left = [438, 29]
La forme de l'image de sortie est [300,300].
Les coordonnées de sortie correspondantes sont:
output_top_left = [0,0]
output_top_right = [0, 299]
output_bottom_right = [299, 299]
output_bottom_left = [299,0]
Voici le code que j'ai utilisé pour la transformation de perspective:
#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 de transformation générée est:
[[ 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]]
Réponses
Vous avez vos coordonnées X, Y inversées. Python / OpenCV les oblige à être répertoriés comme X, Y (même si vous les définissez comme des valeurs numpy). Le tableau que vous devez spécifier pour getPerspectiveTransform doit les répertorier sous la forme X, Y.
Contribution:
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()
Résultats: