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일차 포스트 참고! |
||

5-6. 리매핑
리매핑(Remapping)
영상의 특정 위치 픽셀을 다른 위치에 재배치하는 일반적인 프로세스 (출력 영상의 픽셀을 입력 영상의 픽셀에서 map 함수에 따라 보정해서 적용)
dst(x,y) = src(map_x(x,y), map_y(x,y)
어파인 및 투시 변환을 포함한 다양한 변환을 리매핑으로 표현 가능

리매핑 함수: 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

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줄 내외로 구현할 수 있다는 점이 신기했다.
이번 챕터에서도 흥미로은 영상 편집 기능들을 많이 배웠는데 이후에는 어떤게 있을지 기대된다.



#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online
패스트캠퍼스(FastCampus) 강의 둘러보러 가기
↓ ↓ ↓
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'남돈내배 > 2022_FastCampus_환급이벤트' 카테고리의 다른 글
| 패스트캠퍼스 챌린지 28일차 - Ch6. 영상의 특징 추출 (0) | 2022.02.20 |
|---|---|
| 패스트캠퍼스 챌린지 27일차 - Ch6. 영상의 특징 추출 (0) | 2022.02.19 |
| 패스트캠퍼스 챌린지 25일차 - Ch5. 기하학적 변환 (0) | 2022.02.17 |
| 패스트캠퍼스 챌린지 24일차 - Ch5. 기하학적 변환 (0) | 2022.02.16 |
| 패스트캠퍼스 챌린지 23일차 - Ch4. 필터링 (0) | 2022.02.15 |











