728x90
Affine Transformation
이동, 확대/축소, 전단, 회전 등 다양한 변형이 가능합니다.
원본 좌표와 이동될 좌표의 순서가 중요합니다.
cv2.getAffineTransfomr(src, dst) -> retval
- src: 3개의 원본 좌표
- dst: 3개의 결과 좌표
- retval: 2x3 변환 행렬
cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
- src: 입력 이미지
- M: 2x3 변환 행렬
- dsize: 출력 이미지 사이즈
- dst: 출력 이미지
import cv2
import os
import numpy as np
path = os.path.join('img', 'img.jpg')
img = cv2.imread(path)
rows, cols = img.shape[:2]
pts1 = np.float32([[0, 0], [cols-1, 0], [0, rows-1] ])
cv2.circle(img, (0, 0), 10, (0, 0, 255), -2)
cv2.circle(img, (cols-1, 0), 10, (0, 255, 0), -2)
cv2.circle(img, (0, rows-1), 10, (255, 0, 0), -2)
pts2 = np.float32([[100, 0], [cols-100, 100], [cols-400, 250]])
mat = cv2.getAffineTransform(pts1, pts2)
cv2.circle(mat, (100, 0), 10, (0, 0, 255), -2)
cv2.circle(mat, (cols-100, 100), 10, (0, 255, 0), -2)
cv2.circle(mat, (cols-400, 250), 10, (255, 0, 0), -2)
dst = cv2.warpAffine(img, mat, None)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
원본 좌표로인 2x3 행렬은 빨, 초, 파랑색 점의 순서로 되어있습니다.
pts1 = np.float32([[0, 0], [cols-1, 0], [0, rows-1] ])
cv2.circle(img, (0, 0), 10, (0, 0, 255), -2)
cv2.circle(img, (cols-1, 0), 10, (0, 255, 0), -2)
cv2.circle(img, (0, rows-1), 10, (255, 0, 0), -2)
마찬가지로 결과 좌표인 2x3의 행렬도 빨, 초, 파랑색 점의 순서로 마추어주면 다음과 같이 변환됩니다.
pts2 = np.float32([[100, 0], [cols-100, 100], [cols-400, 250]])
mat = cv2.getAffineTransform(pts1, pts2)
Perspective Transformation
Affirm Transformation 과 달리 4개의 점으로 이동될 때 사용됩니다.
원본 좌표와 이동될 좌표의 순서가 중요합니다.
cv2.getPerspectiveTransform(src, dst, solveMethod=None) -> retval
- src: 4개의 원본 좌표
- dst: 4개의 결과 좌표
- retval: 3x3 변환 행렬
cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
- src: 입력 이미지
- M: 2x3 변환 행렬
- dsize: 출력 이미지 사이즈
- dst: 출력 이미지
import cv2
import os
import numpy as np
path = os.path.join('img', 'img.png')
src = cv2.imread(path)
rows, cols = src.shape[:2]
pts1 = np.float32([[240, 340], [40, 540], [480, 830], [665, 610]])
cv2.circle(src, (240, 340), 10, (0, 0, 255), -1)
cv2.circle(src, (40, 540), 10, (0, 255, 0), -1)
cv2.circle(src, (480, 830), 10, (255, 0, 0), -1)
cv2.circle(src, (665, 610), 10, (0, 255, 255), -1)
pts2 = np.float32([[0, 0], [0, rows-1], [cols-1, rows-1], [cols-1, 0]])
mat = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(src, mat, (cols, rows))
dst = cv2.resize(dst, None, fx=1, fy=0.5)
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
원본 좌표인 3x3의 행렬은 빨, 초, 파, 노랑색점의 순서로 되어있습니다.
pts1 = np.float32([[240, 340], [40, 540], [480, 830], [665, 610]])
cv2.circle(src, (240, 340), 10, (0, 0, 255), -1)
cv2.circle(src, (40, 540), 10, (0, 255, 0), -1)
cv2.circle(src, (480, 830), 10, (255, 0, 0), -1)
cv2.circle(src, (665, 610), 10, (0, 255, 255), -1)
마찬가지로 결과 좌표인 3x3의 행렬도 빨, 초, 파, 노랑색 점의 순서로 마추어주면 다음과 같이 변환됩니다.
pts2 = np.float32([[0, 0], [0, rows-1], [cols-1, rows-1], [cols-1, 0]])
mat = cv2.getPerspectiveTransform(pts1, pts2)
'OpenCV' 카테고리의 다른 글
파이썬 OpenCV 미분 필터링 -2 : Sobel / Scharr / Laplacian (0) | 2020.07.25 |
---|---|
파이썬 OpenCV 미분 필터링 -1 (0) | 2020.07.25 |
파이썬 OpenCV 이미지에 글자 출력하기 : 한글 출력 (PIL) (0) | 2020.07.24 |
파이썬 OpenCV 를 위한 Numpy 정리 (0) | 2020.07.24 |
파이썬 OpenCV 기하학적 변환 알아보기 -2 : 이미지 피라미드 만들기 (0) | 2020.07.24 |