Trasformazione prospettica in OPENCV PYTHON

Sep 18 2020

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

4 fmw42 Sep 19 2020 at 02:03

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: