- 호모그래피(Homography)란?
- 두 평면 사이의 투시 변환(Perspective transform)
- 8DOF: 최소 4개의 대응점 좌표가 필요
- 호모그래피 계산 함수
- 호모그래피를 이용한 영상 매칭 예제
import sys
import numpy as np
import cv2
# 영상 불러오기
#src1 = cv2.imread('graf1.png', cv2.IMREAD_GRAYSCALE)
#src2 = cv2.imread('graf3.png', cv2.IMREAD_GRAYSCALE)
src1 = cv2.imread('box.png',cv2.IMREAD_GRAYSCALE)
src2 = cv2.imread('box_in_scene.png',cv2.IMREAD_GRAYSCALE)
if src1 is None or src2 is None:
print('Image load failed!')
sys.exit()
# 특징점 알고리즘 객체 생성 (KAZE, AKAZE, ORB 등)
feature = cv2.KAZE_create()
#feature = cv2.AKAZE_create()
#feature = cv2.ORB_create()
# 특징점 검출 및 기술자 계산
kp1, desc1 = feature.detectAndCompute(src1, None)
kp2, desc2 = feature.detectAndCompute(src2, None)
# 특징점 매칭
matcher=cv2.BFMatcher_create()
# matcher=cv2.BFMatcher_create(cv2.NORM_HAMMING)
matches=matcher.match(desc1,desc2)
# 좋은 매칭 결과 선별
matches=sorted(matches,key=lambda x: x.distance)
good_matches=matches[:80]
print('# of kp1:', len(kp1))
print('# of kp2:', len(kp2))
print('# of matches:', len(matches))
print('# of good_matches:', len(good_matches))
# 호모그래피 계산 queryIdx=1번 이미지에서의 index, trainIdx=2번 이미지에서의 index
#reshaoe(-1,1,2) --> (N,1,2)로 만든다 여기서는 (80,1,2)가 될것임
pts1=np.array([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1,1,2).astype(np.float32) #(80,2)
pts2=np.array([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1,1,2).astype(np.float32)
H,_=cv2.findHomography(pts1,pts2,cv2.RANSAC)
# 호모그래피를 이용하여 기준 영상 영역 표시
dst=cv2.drawMatches(src1,kp1,src2,kp2,good_matches,None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
(h,w)=src1.shape[:2]
corners1=np.array([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2).astype(np.float32)
corners2=cv2.perspectiveTransform(corners1,H)
#drawMatches 함수를 호출하게 되면 1,2번 영상을 가로로 붙여서 하나로 보여주는데
# 2번영상의 좌표가 1번영상 가로크기만큼 shift되어있기때문에 corners2 를 업데이트 해준다
corners2=corners2 + np.float32([w,0])
cv2.polylines(dst,[np.int32(corners2)],True,(0,255,0),2,cv2.LINE_AA)
cv2.namedWindow('dst',cv2.WIN)
cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()
- 호모그래피 계산 예제 실행 결과
'Computer Vision > opencv(python)' 카테고리의 다른 글
[62] (실습) AR 비디오 플레이어 (0) | 2021.03.25 |
---|---|
[61] 7) 이미지 스티칭 (0) | 2021.03.25 |
[59] 5) 좋은 매칭 선별 (0) | 2021.03.25 |
[58] 4) 특징점 매칭 (0) | 2021.03.25 |
[57] 3) 특징점 기술자 (0) | 2021.03.25 |