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