Transformación de perspectiva en OPENCV PYTHON
Estoy tratando de realizar una transformación de perspectiva de un sudoku. La transformación esperada está sucediendo solo en el lado izquierdo. Por favor ayúdenme señalando mi error.
Imagen de entrada:
Imagen de salida esperada:
La salida que obtengo:
Las esquinas del sudoku encontradas usando cv2.approxpolydp () son las siguientes:
top_left = [71,62]
top_right = [59, 418]
bottom_right = [443, 442]
bottom_left = [438, 29]
La forma de la imagen de salida es [300,300].
Las coordenadas de salida correspondientes son:
output_top_left = [0,0]
output_top_right = [0, 299]
output_bottom_right = [299, 299]
output_bottom_left = [299,0]
El siguiente es el código que utilicé para la transformación de perspectiva:
#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 Matriz de Transformación generada es:
[[ 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]]
Respuestas
Tiene sus coordenadas X, Y invertidas. Python / OpenCV los requiere enumerados como X, Y (aunque los defina como valores numerosos). La matriz que debe especificar para getPerspectiveTransform debe enumerarlos como X, Y.
Aporte:
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()
Resultados: