본문 바로가기

OpenCV/Python

원근(퍼스펙티브) 변환

- 아핀변환과 유사하지만, 직선의 성질만 유지시키고, 사각형을 임의의 사각형 형태로 변환하는 것

3차원 -> 2차원 평면

- 네 모서리 좌표의 점만 안다면 getAffineTransform을 사용하여 퍼스펙티브 변환 행렬을 얻을 수 있다.

- 좌표 순서도 중요하다. 다음과 같은 순으로 좌표를 대입해야 한다.

 

1                       2

 

 

3                       4

 

예제

1. 마우스 클릭으로 원하는 좌표를 저장하도록 mouse_callback 사용

- 좌표는 총 4개 필요하므로 미리 numpy.zero로 만들어둠

 

 

2. 모서리 4개 찍고 esc 눌러서 결과 확인

 

3. 변환 행렬 구하기

 

 

 

import cv2 as cv
import numpy as np

points = np.zeros([4, 2], dtype=np.float32)
idx = 0


def mouse_callback(event, x, y, flags, param):
    global points, idx

    if event == cv.EVENT_LBUTTONDOWN:
        points[idx] = (x, y)
        idx += 1
        print(" (%d,%d) " % (x, y))


cv.namedWindow('test')
cv.setMouseCallback('test', mouse_callback)

img = cv.imread('book.jpg')

img = cv.resize(img, None, fx=0.3, fy=0.3, interpolation=cv.INTER_AREA)

# 점이 찍히면서 이미지가 변동이 생기니 하나 복사해둠
img_original = img.copy()

# 좌표 찍는 시간
while True:
    cv.imshow('test', img)

    h, w = img.shape[:2]

    if cv.waitKey(0) == 27:
        break


dst = np.float32([[0, 0], [w, 0], [0, h], [w, h]])

# 변환 행렬 생성
M = cv.getPerspectiveTransform(points, dst)

img_result = cv.warpPerspective(img_original, M, (w, h))
img_result = cv.resize(img_result, None, fx=0.5, fy=0.5,
                       interpolation=cv.INTER_AREA)

cv.imshow('result', img_result)

cv.waitKey(0)

 

'OpenCV > Python' 카테고리의 다른 글

에지 검출  (0) 2021.06.13
Convolution and Mask  (0) 2021.06.13
영역 지정 (내가 헷갈려서 정리..)  (0) 2021.06.13
이미지 기하학적 변환  (0) 2021.06.13
ROI - 3 응용하기2 ( 평균 색 추출하기)  (0) 2021.06.12