Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 파노라마 영상 만들기 - 이미지 스티칭 - cv2.Stitcher_create, cv2.Stitcher.stitch

AI 꿈나무 2020. 10. 18. 14:43
반응형

이미지 스티칭 - Image Stitching

 이미지 스티칭은 동일 장면의 사진을 자연스럽게(seamless) 붙여서 한 장의 사진으로 만드는 기술입니다.

 사진 이어 붙이기, 파노라마 영상(Panorama image)

 

 

 기본적인 방법은 여러장의 영상에서 특징점을 검출하고 특징점이 동일한 것들을 찾아서 두 장의 영상과의 투시변환 관계를 찾아내어 이어 붙입니다.

 

 

 위 두 영상에서 특징점을 검출 시 하늘에서는 특징점이 검출되지 않습니다.

 엣지가 있고 지글지글한 텍스쳐가 있는 부분만 특징점이 검출됩니다.

 

 

 위 그림에서 양쪽에 검출된 특징점만 남겨둡니다.

 

 

 매칭되는 정보를 이용해서 투시변환 관계를 추출하고 이어 붙입니다.

 단순히 이어 붙이면 밝기가 급격히 바뀌는 부자연스러움이 생깁니다.

 

 

 밝기를 부드럽게 할 수있는 블렌딩을 이용하면 자연스럽게 처리할 수 있습니다.

 

 

 위 그림은 이미지 스티칭의 전제적인 모습입니다.

 여러장의 영상을 입력으로 받아서 리사이즈(속도를 빠르게 하기 위함)을 하고 특징점을 검출합니다.

 특징점 매칭을 하고 투시변환의 상관관계를 계산하고 그 정보를 이용해서 영상을 결합(compositioning)합니다.

 그 후에 노출 보정, 블렌딩을 적용한 후에 최종적인 영상이 만들어 집니다.

 

이미지 스티칭 객체 생성 - cv2.Stitcher_create

 이미지 스티칭을 하기 위해서는 우선 이미지 스티칭 객체를 생성해야 합니다.

 Stitcher 클래스는 surf 또는 ORB를 이용합니다.

 기본적으로 ORB 특징점 검출 알고리즘을 제공합니다.

 

cv2.Stitcher_create(, mode=None) -> retval

• mode: 스티칭 모드. cv2.PANORAMA 또는 cv2.SCANS 중 하나 선택. 기본값은 cv2.PANORAMA.
• retval: cv2.Stitcher 클래스 객체

 mode의 인자는 일반적인 사진을 합성할 때는 cv2.PANORAMA를 입력합니다.

 cv2.SCANS는 스캐너에서 문서를 스캔하듯이 자유도가 좀 더 낮습니다.

 affine, 밝기가 어느정도 균일하다고 가정할 때 이용합니다.

 

이미지 스티칭 함수 - cv2.Stitcher.stitch

 Stitcher 객체를 생성하고 이미지 스티칭 함수를 이용하면 파노라마 영상을 출력할 수 있습니다.

 

cv2.Stitcher.stitch(images, pano=None) -> retval, pano

• images: 입력 영상 리스트

• retval: 성공하면 cv2.Stitcher_OK.

• pano: 파노라마 영상

이미지 스티칭 예제

예제 코드 출처 :  황선규 박사님 github홈페이지 sunkyoo.github.io/opencv4cvml/

 

# 3장의 영상을 리스트로 묶어서 반복문으로 하나하나 갖고옴
img_names = ['img1.jpg', 'img2.jpg', 'img3.jpg']

# 불러온 영상을 imgs에 저장
imgs = []
for name in img_names:
    img = cv2.imread(name)
    
    if img is None:
        print('Image load failed!')
        sys.exit()
        
    imgs.append(img)
    
# 객체 생성
stitcher = cv2.Stitcher_create()

# 이미지 스티칭
status, dst = stitcher.stitch(imgs)

if status != cv2.Stitcher_OK:
    print('Stitch failed!')
    sys.exit()
    
# 결과 영상 저장
cv2.imwrite('output.jpg', dst)

# 출력 영상이 화면보다 커질 가능성이 있어 WINDOW_NORMAL 지정
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()

 

 

 이처럼 이미지 스티칭을 사용하면 여러 장의 영상을 하나의 영상으로 묶을 수 있습니다.


OpenCV 홈페이지와 황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.

논문 출처 : matthewalunbrown.com/papers/ijcv2007.pdf

OpenCV 홈페이지 : docs.opencv.org/master/d1/d46/group__stitching.html

 

반응형