Ttp*_*ala 4 python opencv numpy
我正在尝试对数独谜题进行透视变换。预期的转换仅发生在左侧。请帮助我指出我的错误。
输入图像:
预期输出图像:
我得到的输出:
使用cv2.approxpolydp()找到的数独游戏的角落如下:
top_left = [71,62]
top_right = [59, 418]
bottom_right = [443, 442]
bottom_left = [438, 29]
Run Code Online (Sandbox Code Playgroud)
输出图像的形状为 [300,300]。
对应的输出坐标为:
output_top_left = [0,0]
output_top_right = [0, 299]
output_bottom_right = [299, 299]
output_bottom_left = [299,0]
Run Code Online (Sandbox Code Playgroud)
以下是我用于透视变换的代码:
top_left = [71,62]
top_right = [59, 418]
bottom_right = [443, 442]
bottom_left = [438, 29]
Run Code Online (Sandbox Code Playgroud)
生成的变换矩阵为:
[[ 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]]
Run Code Online (Sandbox Code Playgroud)
您的 X、Y 坐标颠倒了。Python/OpenCV 要求将它们列为 X、Y(即使您将它们定义为 numpy 值)。您必须为 getPerspectiveTransform 指定的数组必须将它们列为 X、Y。
输入:
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()
Run Code Online (Sandbox Code Playgroud)
结果: