5-5. 어파인 변환과 투시 변환

어파인(Affine) vs. 투시(Perspective) 변환(Transform)

    기본 영상을 변환하는데 있어 두 가지 방식을 비교

  Affine Perspective
변환 행렬
구조

2x3 matrix

3x3 matrix
* matrix 안 1 = p33으로도 표현
변환 예시
DOF
사용 방식
6 DOF 사용


8 DOF 사용

행렬
구하는
함수
cv2.getAffineTransform(src, dst) -> retval cv2.getPerspectiveTransform(src, dst, solveMethod) -> retval
src는 3개의 원본 좌표점 (numpy.ndarray.shape=(3,2)) 구조로 실수형
dst는 3개의 결과 좌표점입력과 동일한 구조
retval은 2x3 Affine 변환 행렬
src는 4개의 원본 좌표점 (numpy.ndarray.shape=(4,2)) 구조로 실수형
dst는 4개의 결과 좌표점입력과 동일한 구조
retval은 3x3 Affine 변환 행렬
행렬 적용
변환 함수
cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue) -> dst

cv2.warpPerspective(src, M, dsize, dst, flags, borderMode, borderValue) -> dst
Affine과 Perspective간에 다른 점은 변환 행렬 인자인 M의 사이즈이다. Affine의 경우 2x3 행렬, Perspective의 경우 3x3 행렬을 요구한다.
* 자세한 변수 설명은 24일차 포스트 참고!

 

제공된 사진을 Affine 변환과 Perspective 변환 적용한 결과.


5-6. 리매핑

리매핑(Remapping)

    영상의 특정 위치 픽셀을 다른 위치에 재배치하는 일반적인 프로세스 (출력 영상의 픽셀을 입력 영상의 픽셀에서 map 함수에 따라 보정해서 적용)

dst(x,y) = src(map_x(x,y), map_y(x,y)

    어파인 및 투시 변환을 포함한 다양한 변환을 리매핑으로 표현 가능

   

좌: 이동 변환 map 함수 예시 / 우: 대칭 변환 map 함수 예시

    리매핑 함수: cv2.remap(src, map1, map2, interpolation, dst, borderMode, borderValue) -> dst

     src는 입력 영상, dst는 출력 영상

     map1은 결과 영상의 (x,y) 좌표가 참조할 입력 영상의 x 좌표로 입력 영상과 크기가 동일한 np.float32 타입을 갖는 numpy.ndarray

     map2은 결과 영상의 (x,y) 좌표가 참조할 입력 영상의 y 좌표로 입력 영상과 크기가 동일한 np.float32 타입을 갖는 numpy.ndarray

     interpolation은 보간법

     borderMode는 가장자리 픽셀 확장 방식으로 기본값은 cv2.BORDER_CONSTANT

     borderValue는 cv2.BORDER_CONSTANT를 borderMode 적용에 따라 사용되는 상수 값으로 기본값은 0

 

sine과 cosine 두 가지 삼각 함수를 이용한 remapping 결과


5-7. 실전 코딩

문서 스캐너

    카메라로 촬영한 문서 영상을 똑바로 펴서 저장해주는 프로그램

    구현할 기능:

     1. 마우스로 문서 모서리 선택 & 이동하기

       - 마우스 이벤트 처리 (왼쪽 버튼 클릭 / 클릭&드래그 / 릴리즈)

       - 문서 네 개의 모서리 좌표 기록

     2. 키보드 ENTER 키 인식으로 입력값 저장

     3. 왜곡된 문서 영상을 직사각형 형태로 똑바로 펴기

       - 네 개의 모서리를 사용하기 때문에 투시 변환 사용

       - 변환될 문서 사이즈의 네 모서리 좌표 저장 (ex. A4: 210x297. 출력 크기를 변환하고 싶은 경우 임의의 w에 문서 사이즈에 맞춰서 스케일링 한다)

       - 투시 변환 좌표 계산

       - 실제 영상을 투시 변환 하여 출력

    아래 코드는 기능을 구현하는데 필요한 로직이다.

#import sys
#import numpy
#import openCV

# define drawROI function (input image, 4 corners of input image)
 # copy input image
 # define color for corner circle and rectangle line
 # draw circle for all corners
 # draw line from one corner to the other corner
 # use addWeighted function to make drawed shapes have transparency

# define onMouse function (event, x, y, flags, param)
 # if left mouse button is down event
   # if click position is with in circle
     # make drag indication true
     # update click position
 # if left mouse button is released event
   # make all drag indication false
 # if mouse is moved event
   # check anu drag indication is true
     # calculate new position of ROI corner
     # redraw ROI
     # show image
     # update click position

# read input image
 # check whether image is loaded successfully
 
# define variables for input and output image size (w,h)

# define numpy array in float32 to store 4 corners of input and output image
# define numpy array to store indication of drag of ROI corners

# draw dots on corner of ROI rectangle by using drawROI function

# display input image with ROI rectangle
# call mouse event function

# infinite loop
 # wait for keyboard input
 # if it is enter key, break out the loop
 # if it is ESC key, destroy all windows and finish the program

# operate perspective transformation

# display output image
# wait for keyboard input
# if any key is pressed finish the program

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.


인증 타임

Affine 변환과 Perspective 변환 두 방식을 다 둘러보았는데 실제 사진에서 기울어진 것을 평평하게 만드는 데는 8 DOF를 사용하는 Perspective 변환 방식이 더 나음을 볼 수 있었다. 

Remapping의 경우 borderMode를 cv2.BORDER_DEFAULT를 사용해야지 빈 공간이 근처 픽셀값으로 채워지기 때문에 더 자연스러운 결과 영상을 얻을 수 있다.

실전 코딩의 경우 다른 앱에서 많이 사용해봤던 기능이라 python으로 100줄 내외로 구현할 수 있다는 점이 신기했다.

이번 챕터에서도 흥미로은 영상 편집 기능들을 많이 배웠는데 이후에는 어떤게 있을지 기대된다.

5-5. 공부 인증 사진
5-6. 공부 인증 사진
5-7. 공부 인증 사진


#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

 

패스트캠퍼스(FastCampus) 강의 둘러보러 가기 

   

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.


 

+ Recent posts