9-6. 호모그래피와 영상 매칭
호모그래피(Homography)
두 평면 사이의 투시 변환(Perspective transform) 방식으로 8DOF가 필요함에 따라 최소 4개의 대응점 좌표가 필요

호모그래피 계산 함수: cv2.findHomography(srcPoints, dstPoints, method, ransacReprojThreshold, mask, maxIters, confidence) -> retval, mask
srcPoints는 (N,1,2) 크기, numpy.float32 타입의 numpy.ndarray 형식의 입력 점 (특징점) 좌표
dstPoints는 (N,1,2) 크기, numpy.float32 타입의 numpy.ndarray 형식의 결과 점 (특징점) 좌표
method는 호모그래피 행렬 계산 방식으로, 0은 기본값, cv2.RANSAC(RANdom SAmple Consensus), cv2.RHO는 이상치(outlier)가 있을 경우 권장하며 cv2.LMEDS 방법도 있다.
ransacReprojThreshold는 RANSAC 재투영 에러 허용치로 기본값은 3
maxIters는 RANSAC 최대 반복 횟수로 기본값은 2000
retval는 (3,3) 크기, numpy.float32 타입의 numpy.ndarray 형식의 호모그래피 행렬(H)
mask는 (N,1) 크기, numpy.uint8 타입의 numpy.ndarray 형식의 출력 마스크 행렬로 RANSAC, RHO 방법 사용시 정상범위치(Inlier)로 사용된 점들을 1로 표시한 행렬
호모그래피를 사용하여 영상을 매칭 해보는 코드 순서는 아래와 같이 작성되었다.
#import sys
#import numpy
#import OpenCV
# 매칭할 두 영상 불러오기
# 하나는 찾아야할 객체 영상
# 찾아야할 객체가 포함된 다른 영상
# 영상이 잘 불러와졌는지 확인
# 특징점 알고리즘 객체 생성
# 특징점 검출 및 기술자 계산
# 특징점 매칭
# 좋은 매칭 결과 선벌
# 호모그래피 계산을 위해 좋은 매칭 결과에서 좌표 추출
# 검출된 특징점 중 좋은 매칭 결과 행렬에서 queryIdx에 해당되는 특징점 값들로만 모아서 numpy.float32 형식 행렬 생성
# 검출된 특징점 중 좋은 매칭 결과 행렬에서 trainIdx에 해당되는 특징점 값들로만 모아서 numpy.float32 형식 행렬 생성
# 호모그래피 계산
# 좋은 매칭 결과 행렬 결과 출력
# 호모그래피를 이용하여 기준 영상 영역 표시
# 객체 영상 기준 네 코너 좌표를 포함한 행렬을 (4,1,2)크기와 numpy.float32 데이터 타입을 갖게끔 생성
# 호모그래피 행렬과 코너 좌표를 이용한 투시 변환(cv2.perspectiveTransform)
# drawMatches를 사용할 경우 두 영상을 붙여서 그리기 때문에 계산된 코너에 객체 영상 w 더해주기
# polylines 함수를 활용하여 검출된 객체 영상 그리기
# 최종 영상 출력

9-7. 이미지 스티칭
이미지 스트칭(Image Stitching)
사진 이어 붙이기나 파노라마 영상(Panorama image)과 같이 동일 장면의 사진을 자연스럽게(seamless) 붙여서 한 장의 사진으로 만드는 기술

OpenCV에서 제공하는 이미지 스티칭 함수의 경우 아래 파이프라인 구조와 비슷하게 동작한다. (링크)

이미지 스티칭 객체 생성: cv2.Stitcher_create(, mode) -> <cv2.Stitcher Object>
mode는 스티칭 모드로 cv2.STITCHER_PANORAMA 또는 cv2.STITCHER_SCANS(Affine Transform 기반으로 영상의 밝기도 균일하다 가정) 중 하나를 선택하여 cv2.PANORAMA가 기본값이다.
이미지 스티칭 함수: <cv2.Stitcher Object>.stitch(images, pano) -> retval, pano
images는 입력 영상 리스트
retval는 이미지 스티칭에 성공했을 경우 cv2.Stitcher_OK를 반환한다
pano는 파노라마 영상

9-8. 실전 코딩
AR 비디오 플레이어
카메라 프레임에 특정 영상이 나타나면 해당 위치에 동영상을 재생하는 기능
유용한 정보를 중첩해서 보여줄 때 유용하다.
구현할 기능:
1. 기준 영상과 카메라 프레임 사이의 특징점 검출 및 매칭
2. 호모그래피 계산
3. 동영상 프레임 투시 변환 및 합성

#import sys
#import numpy
#import OpenCV
# 기준 영상(reference image) 불러오기
# 영상 잘 불러와졌는지 확인
# 카메라 장치 열기
# 장치가 잘 열렸는지 확인
# 카메라 프레임 화면에 출력할 동영상 파일 열기
# 동영상이 잘 열렸는지 확인
# 특징점 알고리즘 객체 생성
# 기준 영상에서 특징점 검출 및 기술자 생성
# 해밍 거리를 사용하는 매칭 객체 생성
# Infinite Loop
# 카메라 프레임 읽어오기
# 프레임 잘 읽어 왔는지 확인
# 매 프레임마다 특징점 검출 및 기술자 생성
# 특징점이 너무 작으면 에러가 나는 경우가 있기 때문에 100개 이상 검출 시 매칭 수행
# 기준 영상과 프래밍 매칭
# 좋은 매칭 방법을 사용하여 매칭 특징점 검출
# 호모그래피 계산할 특징점 검출
# 호모그래피 계산
# 호모그래피 계산에 사용된 Inlier가 20개 이상일 경우 (정상적으로 매칭된 특징점 갯수가 일정값을 넘길 경우)
# 비디오 프레임을 읽어오기
# 프레임 잘 읽어왔는지 확인
# 비디오 프레임을 투시 변환
# 비디오가 합성될 부분을 백색 처리한 mask 영상 만들기
# 비디오 프레임을 카메라 프레임에 합성
# 프레임 출력
# ESC 키가 눌리는 경우 종료
# 카메라와 동영상 객체 닫기
# 모든 창 끄기
인증 타임
호모그래피의 경우 저번 이미지 검출 때처럼 전자 보드에서 부품을 찾는데 있어 유용하게 쓸 수 있을 거 같다.
이미지 스티칭의 경우 파노라마로도 많이 봤지만 RealityCaputre나 AutoDest의 ReCap과 같은 프로그램에서 3D로 구현되는 모습과 흡사해서 더 기억에 남는다.
실전 코딩의 경우 다양한 영상 편집에서도 보았지만 특히 미국 드라마 모던 패밀리(Mordern Family) 시즌 초기 인트로에서 자주 봤던 모습이 생각났다. 카메라가 없어서 강의 영상에서 테스트 한 모습만 확인 했지만 매우 유용하게 느껴졌다.
OpenCV를 배우면서 느끼는 점은 실생활에서 툴로써나 활용된 모습의 뒷모습을 배우는 느낌이라 항상 새롭다. 배웠던 것들을 기반으로 만들어 볼만한게 무엇이 더 있을까?



#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online
패스트캠퍼스(FastCampus) 강의 둘러보러 가기
↓ ↓ ↓
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'남돈내배 > 2022_FastCampus_환급이벤트' 카테고리의 다른 글
| 패스트캠퍼스 챌린지 39일차 - Ch10. 객체 추적과 모션 벡터 (0) | 2022.03.03 |
|---|---|
| 패스트캠퍼스 챌린지 38일차 - Ch10. 객체 추적과 모션 벡터 (0) | 2022.03.02 |
| 패스트캠퍼스 챌린지 36일차 - Ch9. 특징점 검출과 매칭 (0) | 2022.02.28 |
| 패스트캠퍼스 챌린지 35일차 - Ch9. 특징점 검출과 매칭 (0) | 2022.02.27 |
| 패스트캠퍼스 챌린지 34일차 - Ch8. 영상 분할과 객체 검출 (0) | 2022.02.26 |