Computer Vision/opencv(python)

[58] 4) 특징점 매칭

jwjwvison 2021. 3. 25. 11:51
  • 특징점 매칭 (feature point matching)
    • 두 영상에서 추출한 특징점 기술자를 비교하여 서로 유사한 기술자를 찾는 작업

 

  • 특징 벡터 유사도 측정 방법
    • 실수 특징 벡터: (L2 norm) 사용
    • 이진 특징 벡터: (hamming distance) 사용

 

  • OpenCV 특징점 매칭 클래스

 

  • 특징점 매칭 알고리즘 객체 생성
cv2.BFMatcher_create(normType=None,crossCheck=None) -> retval

 

  • 특징점 검출 알고리즘 객체 생성
cv2.DescriptorMatcher.match(queryDescriptors,trainDescriptors,mask=None) -> matches

 • queryDescriptors (기준 영상 특징점) 질의 기술자 행렬
 • trainDescriptors : (대상 영상 특징점) 학습 기술자 행렬
 • mask: 매칭 진행 여부를 지정하는 행렬 마스크

 • matches: 매칭 결과 . cv2.DMatch 객체의 리스트

cv2.DescriptorMatcher.knnmatch(queryDescriptors,trainDescriptors,k,mask=None,compactResult=None)
-> matches

 • queryDescriptors (기준 영상 특징점) 질의 기술자 행렬
 • trainDescriptors : (대상 영상 특징점) 학습 기술자 행렬
 • k: 질의 기술자에 대해 검출할 매칭 개수
 • mask: 매칭 수행 여부를 지정하는 행렬 마스크
 • compactResult : mask 가 None 이 아닐 때 사용되는 파라미터 . 기본값은 False 이며 이 경우 결과 matches 는 기                              준 영상 특징점과 같은 크기를 가짐 .

 • matches: 매칭 결과 cv2.DMatch 객체의 리스트의 리스트

 

  • 특징점 매칭 결과 영상 생성

 

  • 특징점 매칭 예제
import sys
import numpy as np
import cv2


# 영상 불러오기
src1 = cv2.imread('graf1.png', cv2.IMREAD_GRAYSCALE)
src2 = cv2.imread('graf3.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()           #실수 descriptor(기술자)를 쓴다
#feature = cv2.AKAZE_create()         #이진 기술자를 쓴다 --> 밑에서 NORM_HAMMING 을 사용해야함
#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)

print('# of kp1:', len(kp1))
print('# of kp2:',len(kp2))
print('# of matches:',len(matches))

# 특징점 매칭 결과 영상 생성
dst=cv2.drawMatches(src1,kp1,src2,kp2,matches,None)

cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()