이미지 매칭
이미지 매칭 Image Matching
- 서로 다른 두 이미지를 비교해서 짝이 맞는 같은 형태의 객체가 있는지 찾아내는 기술
- 키포인트 (Keypoint): 이미지 내에서 특징적인 위치를 나타내는 점
- 디스크립터 (Descriptor): 키포인트 주변의 지역적인 이미지 정보를 숫자 벡터로 표현한 것.
- 이 벡터는 해당 키포인트의 "지문" 역할
- 다른 이미지에서 유사한 특징점을 찾을 때 비교에 사용
- ORB (Oriented FAST and Rotated BRIEF) 특징점 검출기:
- FAST 알고리즘을 이용해 키포인트 검출
- BRIEF 알고리즘을 이용해 디스크립터 생성
- Oriented & Rotated: 키포인트의 방향성과 디스크립터의 회전 개념을 추가
특징 디스크립터 Feature Descriptor
img1 = cv.imread('taekwonv1.jpg')
img2 = cv.imread('figures2.jpg')
gray1 = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
gray2 = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
detector = cv.ORB_create()
kp1, desc1 = detector.detectAndCompute(gray1, None)
kp2, desc2 = detector.detectAndCompute(gray2, None)
특징 매칭 Feature Matching
matcher = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
matches = matcher.match(desc1, desc2)
matches = sorted(matches, key=lambda x:x.distance)
res1 = cv.drawMatches(img1, kp1, img2, kp2, matches, None,
flags=cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)
show(res1)
호모그래피 Homography
- 두 장의 사진이 다른 방향과 각도에서 촬영한 것이므로 완전히 일치하지는 않음
- 투시 변환을 통해서 방향과 각도를 맞출 수 있음(호모그래피 ≒ 투시 변환)
src_pts = np.float32([ kp1[m.queryIdx].pt for m in matches ])
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in matches ])
mtrx, mask = cv.findHomography(src_pts, dst_pts, cv.RANSAC, 5.0)
시각화
h,w = img1.shape[:2]
pts = np.float32([ [[0,0]],[[0,h-1]],[[w-1,h-1]],[[w-1,0]] ])
dst = cv.perspectiveTransform(pts, mtrx)
img2 = cv.polylines(img2,[np.int32(dst)],True,(0, 255, 0),3, cv.LINE_AA)
show(img2)
좋은 매칭점만 보기
matchesMask = mask.ravel().tolist()
[kp for kp, m in zip(matches, matchesMask) if m == 1]
res2 = cv.drawMatches(img1, kp1, img2, kp2, matches, None,
matchesMask = matchesMask,
flags=cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)
show(res2)
퀴즈