컴퓨터 비전기하학적 변환: 투시 변환투시 변환 Perspective transform 아핀 변환에 투시 항 c_0, c_1을 추가하면 투시 변환 반대로 c_0 = c_1 = 0이면 아핀 변환과 같음 wix′wiy′wi=a00a10c0a01a11c1b0b11xy1 아핀변환보다 자유도가 높음 4개의 점이 주어지면 투시 변환 행렬을 결정할 수 있음 체스 보드 import cv2 as cv import numpy as np src = cv.imread('chessboard.jpg') pts1 = np.array([ [60, 500], [900, 100], [900, 1100], [1700, 500] ], dtype=np.int32) pts2 = np.float32([ [0, 0], [1000, 0], [0, 1000], [1000, 1000] ]) cv.circle(src, tuple(pts1[0]), 20, (255, 0, 0), -1) cv.circle(src, tuple(pts1[1]), 20, (0, 255, 0), -1) cv.circle(src, tuple(pts1[2]), 20, (0, 0, 255), -1) cv.circle(src, tuple(pts1[3]), 20, (255, 255, 0), -1) show(src) 아핀 변환 3개의 점이 주어지면 아핀 변환 행렬을 결정할 수 있음 src_pts = pts1[:3].astype(np.float32) # 원본의 점 3개 dst_pts = pts2[:3] # 원본 점에 대응하는 변환된 점 3개 matrix = cv.getAffineTransform(src_pts, dst_pts) dst = cv.warpAffine(src, matrix, (1000, 1000)) show(dst) 아핀 변환은 2차원에서 회전하거나 기울이는 것만 가능 체스 보드를 복원하려면 3차원에서 회전이 필요 투시 변환 matrix = cv.getPerspectiveTransform(pts1.astype(np.float32), pts2) dst = cv.warpPerspective(src, matrix, (1000, 1000)) show(dst)