Computer Vision/opencv(python)

[60] 6) 호모그래피와 영상 매칭

jwjwvison 2021. 3. 25. 14:06
  • 호모그래피(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