투시 변환을 통해 더욱 다양한 각도로 변환이 가능하다.
어파인 변환은 마지막 한 점이 자동으로 결정되는 반면, 투시 변환은 마지막 점까지 수동으로 결정해야 한다.
cv2.getAffineTransform(src, dst) -> retval
np.array([[x1, y1], [x2, y2], [x3, y3]], np.float32)
cv2.getPerspectiveTransform(src, dst, solveMethod=None) -> retval
np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]], np.float32)
cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
src = cv2.imread('namecard.jpg')
w, h = 720, 400
srcQuad = np.array([[325, 307], [760, 369], [718, 611], [231, 515]], np.float32)
dstQuad = np.array([[0, 0], [w-1, 0], [w-1, h-1], [0, h-1]], np.float32)
pers = cv2.getPerspectiveTransform(srcQuad, dstQuad)
dst = cv2.warpPerspective(src, pers, (w, h))
src = cv2.imread('namecard.jpg')
clicked_points = []
def on_mouse(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
clicked_points.append([x, y])
w, h = 720, 400
srcQuad = np.array([clicked_points[0], clicked_points[1], clicked_points[2], clicked_points[3]], np.float32)
dstQuad = np.array([[0, 0], [w-1, 0], [w-1, h-1], [0, h-1]], np.float32)
pers = cv2.getPerspectiveTransform(srcQuad, dstQuad)
dst = cv2.warpPerspective(src, pers, (w, h))