การแปลงมุมมองใน OPENCV PYTHON

Sep 18 2020

ฉันกำลังพยายามเปลี่ยนมุมมองของปริศนาซูโดกุ การเปลี่ยนแปลงที่คาดหวังจะเกิดขึ้นทางด้านซ้ายเท่านั้น โปรดช่วยฉันด้วยการชี้ให้เห็นความผิดพลาดของฉัน

ภาพอินพุต:

ภาพผลลัพธ์ที่คาดหวัง:

ผลลัพธ์ที่ฉันได้รับ:

มุมของปริศนาซูโดกุที่พบโดยใช้cv2.approxpolydp ()มีดังนี้:

top_left = [71,62]
top_right = [59, 418]
bottom_right = [443, 442]
bottom_left = [438, 29]

รูปร่างของภาพที่ส่งออกคือ [300,300]

พิกัดเอาต์พุตที่สอดคล้องกันคือ:

output_top_left = [0,0]
output_top_right = [0, 299]
output_bottom_right = [299, 299]
output_bottom_left = [299,0]

ต่อไปนี้เป็นรหัสที่ฉันใช้สำหรับการแปลงมุมมอง:

#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))

เมทริกซ์การเปลี่ยนแปลงที่สร้างขึ้นคือ:

[[ 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]]

คำตอบ

4 fmw42 Sep 19 2020 at 02:03

คุณมีพิกัด X, Y ของคุณกลับด้าน Python / OpenCV ต้องการให้แสดงเป็น X, Y (แม้ว่าคุณจะกำหนดเป็นค่าตัวเลขก็ตาม) อาร์เรย์ที่คุณต้องระบุให้ 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()

ผล: