[ch05] 기하학적 변환 - 어파인 변환과 투시 변환

빨주노·2021년 8월 22일
0

어파인 변환 vs. 투시 변환

투시 변환을 통해 더욱 다양한 각도로 변환이 가능하다.

어파인 변환은 마지막 한 점이 자동으로 결정되는 반면, 투시 변환은 마지막 점까지 수동으로 결정해야 한다.

어파인 변환 행렬 구하기

cv2.getAffineTransform(src, dst) -> retval
  • src : 3개의 원본 좌표점. numpy.ndarray.shape=(3, 2)
    • ex) np.array([[x1, y1], [x2, y2], [x3, y3]], np.float32)
  • dst : 3개의 결과 좌표점. numpy.ndarray.shape=(3, 2)
  • retval : 2x3 투시 변환 행렬

투시 변환 행렬 구하기

cv2.getPerspectiveTransform(src, dst, solveMethod=None) -> retval
  • src : 4개의 원본 좌표점. numpy.ndarray.shape=(4, 2)
    • ex) np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]], np.float32)
  • dst : 4개의 결과 좌표점. numpy.ndarray.shape=(4, 2)
  • retval : 3x3 투시 변환 행렬

영상의 어파인 변환 함수

cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
  • src : 입력 영상
  • M : 2x3 어파인 변환 행렬. 실수형.
  • dsize : 결과 영상 크기. (w, h) 튜플. (0, 0) 이면 src와 같은 크기로 설정.
  • dst : 결과 영상
  • flags : 보간법. 기본값은 cv2.INTER_LINEAR.
  • borderMode : 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
  • borderValue : cv2.NORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0.

영상의 투시 변환 함수

cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
  • src : 입력 영상
  • M : 3x3 투시 변환 행렬. 실수형.
  • dsize : 결과 영상 크기. (w, h) 튜플. (0, 0) 이면 src와 같은 크기로 설정.
  • dst : 출력 영상
  • flags : 보간법. 기본값은 cv2.INTER_LINEAR.
  • borderMode : 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
  • borderValue : cv2.BORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0.

투시 변환 예제 (찌그러진 명함 펴기)

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))
  • 마우스 왼쪽 버튼으로 아래 빨간 점 위치를 누른다.
  • 그 결과, 빨간 점을 이어서 만들어진 사각형 형태로 출력되었다.
profile
딥 하게 딥러닝 하는중

0개의 댓글