logo

기하학적 변환: 투시 변환

투시 변환 Perspective transform

  • 아핀 변환에 투시 항 c_0, c_1을 추가하면 투시 변환
  • 반대로 c_0 = c_1 = 0이면 아핀 변환과 같음
  • 아핀변환보다 자유도가 높음
  • 4개의 점이 주어지면 투시 변환 행렬을 결정할 수 있음

투시 변환 Perspective transform 이미지 1

체스 보드

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)

체스 보드 다이어그램 1

아핀 변환

  • 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차원에서 회전이 필요

아핀 변환 이미지 1

투시 변환

matrix = cv.getPerspectiveTransform(pts1.astype(np.float32), pts2)
dst = cv.warpPerspective(src, matrix, (1000, 1000))
show(dst)

투시 변환 이미지 1

Previous
기하학적 변환: 아핀 변환