9-2. 특징점 검출
크기 불변 특징점 검출
코너 검출(Harris, GFTT, FAST) 방식은 이동, 회전 변환에 강인한 반면 크기 변환에 취약
코너 대신 스케일 스페이스(scale-space)와 이미지 피라미드(image pyramid)를 구성하여 크기 불변 특징점을 검출
SIFT, KAZE, AKAZE, ORB 등 다양한 방법이 사용하고 있다.

특징점(Feature point)는 여기서 키포인트(keypoint), 관심점(interest point)와 동일한 의미
영상 내 특정 포인트 특징점의 경우 local feature point라고 불리기도 한다.
OpenCV 특징점 검출 클래스: Feature2D 클래스와 파생 클래스
cv2.SIFT는 OpenCV 4.4.0 버전 이후로 무료화 되었으니 사용할 때 주의해야한다. (더 자세한 클래스는 여기서 볼수 있다.)

특징점 검출 알고리즘 객체 생성: cv2.(Detect Algorithm Name)_create(, ...) -> <(Detect Algorithm Name) Object>
(Detect Algorithm Name)에는 SIFT, KAZE, AKAZE, ORB 등이 있다.
각각의 알고리즘은 고유한 파라미터를 인자로 받을 수 있고, 주지 않아도 대부분의 인자가 기본값을 가지고 있으므로 없이도 호출 가능하다.
특징점 검출 함수: cv2.Feature2D.detect(image, mask) -> keypoints
image는 입력 영상이다.
mask는 마스크 영상이다.
keypoints는 cv2.KeyPoint 객체의 리스트 형식의 검출된 특징점 정보이다.
검출된 특징점 그리기 함수: cv2.drawKeypoints(image, keypoints, outImage, color, flags) -> outImage
image는 입력 영상이고, outImage는 출력 영상이다.
keypoints는 cv2.KeyPoint 객체의 리스트 형식의 검출된 특징점 정보이다.
color는 특징점 표현 색상으로 기본값은 (-1,-1,-1,-1)로 세팅 되면 임의의 색상으로 표현된다.
flags는 특징점 표현 방법으로 cv2.DRAW_MATCHES_FLAGS_DEFAULT는 특징점 위치만 표현하는 작은 크기의 원, cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS는 특징점의 크기와 방향을 반영한 원을 그리게 된다.


9-3. 특징점 기술
기술자(Descriptor) 또는 특징 벡터 (feature vector)
특징점 근방의 부분 영상을 표현하는 실수(numpy.float32, cv2.CV_32F) 또는 이진(numpy.uint8, cv2.CV_8U) 벡터로 OpenCV에서는 2차원 행렬(numpy.ndarray)로 표현
행의 개수: 특징점 개수 / 열의 개수: 특징점 기술자 알고리즘에 의해 정의

| 실수 기술자 | 이진 기술자(Binary Descriptor) | |
| 기술 방식 | 주로 특징점 부근 부분 영상의 방향 히스토그램을 사용 | 이진 테스트(Binary Test)를 이용하여 부분 영상의 특징을 기술 |
![]() |
![]() |
|
![]() |
![]() |
|
| 자료형 | 보통 numpy.float32 자료형을 사용하여 실수 정보를 저장 | 보통 numpy.uint8 자료형을 사용하여 비트 단위로 영상 특징 정보를 저장 |
| 사용 알고리즘 |
SIFT, SURF, KAZE 등 | AKAZE, ORB, BRIEF 등 |
| 유사도 판단 |
보통 L2 NORM을 사용하여 판단 | 보통 해밍 거리(Hamming distance)를 사용하여 판단 (ex. d1=1011101, d2=1001001 -> 해밍 거리는 2) |
특징점 기술자 계산 함수: cv2.Feature2D.compute(image, keypoints, descriptor) -> keypoints, descriptors
image는 입력 영상
keypoints는 cv2.KeyPoint 객체의 리스트 형식으로 검출된 특징점 정보
descriptors는 특징점 기술자 행렬
특징점 검출 및 기술자 계산 함수: cv2.Feature2D.detectAndCompute(image, mask, descriptor) -> keypoints, descriptors
image는 입력 영상
mask는 마스크 영상
keypoints는 cv2.KeyPoint 객체의 리스트 형식으로 검출된 특징점 정보
descriptors는 특징점 기술자 행렬
특징점 검출 알고리즘 특성 및 성능 비교
알고리즘 및 기술자 특성

연산 시간 비교 (논문 링크)

반복 검출율 (논문 링크)

정확도 (논문 링크)

9-4. 특징점 매칭
특징점 매칭 (feature point matching)
두 영상에서 추출한 특징점 기술자를 비교하여 서로 유사한 기술자를 찾는 작업

OpenCV 특징점 매칭 클래스: DMatch 클래스와 DescriptorMatcher 클래스
BF는 Brute-force로 전수 조사 방식을 사용하며, Flann은 Fast Library for Approximate Nearest Neighbor의 줄임말로 K-D Tree를 사용한다. (더 자세한 클래스 설명은 여기서 볼 수 있다.)

특징점 매칭 알고리즘 객체 생성:
1. cv2.BFMatcher_create(, normType, crossCheck) -> retval
normType는 특징점 기술자 거리 계산 방식 상수로 기본값은 cv2.NORM_L2. cv2.NORM_L1은 L1 norm 값 사용, cv.2NOMR_HAMMING은 해밍 거리, cv2.NORM_HAMMING2는 두 비트를 한 단위로 취급하여 해밍 거리를 계산이다.
crossCheck은 양방향 매칭 결과가 같은 경우만 반환하게 하는게 True, 기본값은 False이다.
retval는 cv2.DescriptorMatcher 객체를 반환한다.
2. cv2.DescriptorMatcher.match(queryDescriptors, trainDescriptors, mask) -> matches
queryDescriptors는 기준 영상 특징점 질의 기술자 행렬
trainDescriptors는 대상 영상 특징점 학습 기술자 행렬
mask는 매칭 진행 여부를 지정하는 행렬 마스크
matches는 cv2.DMatch 객체의 리스트 형식의 매칭 결과
3. cv2.DescriptorMatcher.knnMatch(queryDescriptors, trainDescriptors, k, mask, compactResult) -> matches
queryDescriptors는 기준 영상 특징점 질의 기술자 행렬
trainDescriptors는 대상 영상 특징점 학습 기술자 행렬
k는 질의 기술자에 대해 검출할 매칭 개수
mask는 매칭 수행 여부를 지정하는 행렬 마스크
compactResult는 mask가 None이 아닐 때 사용되는 파라미터로 기본값은 False이며 matches가 기준 영상 특징점과 같은 크기를 갖게한다.
matches는 cv2.DMatch 객체의 리스트 형식의 매칭 결과
* knnMatch를 사용하면 k만큼의 매칭 개수를 compactResult 기준에 따라 특징점만큼의 매칭 결과를 출력하기 때문에 결과를 drawMatches를 사용할 경우 matches1to2에 넣어주기 전에 데이터 가공이 필요하다.
특징점 매칭 결과 영상 생성: cv2.drawMatches(img1, keypoints1, img2, keypoints2, matches1to2, outImg, matchColor, singlePointColor, matchesMask, flags) -> outImg
img1, keypoints1는 기준 영상과 기준 영상에서 추출한 특징점 정보
img2, keypoints2는 대상 영상과 대상 영상에서 추출한 특징점 정보
matches1to2는 cv2.DMatch의 리스트 형식의 매칭 정보
outImg는 출력 영상
matchColor는 매칭된 특징점과 직선 색상으로 기본값을 쓸 경우 임의의 값으로 그려준다.
singlePointColor는 매칭되지 않은 특징점 색상
matchesMask는 매칭 정보를 선택하여 그릴 때 사용할 마스크
flags는 매칭 정보 그리기 방법으로 기본값은 cv2.DRAW_MATCHES_FLAGS_DEFAULT이다.

9-5. 좋은 매칭 선별
방법1: 가장 좋은 매칭 결과에서 distance 값이 작은 것 N개를 사용
cv2.DMatch.distance 값을 기준으로 정렬 후 상위 N개를 선택
방법2: 가장 좋은 매칭 결과의 distance 값과 두 번째로 좋은 매칭 결과의 distance 값의 비율 계산
계산된 비율이 사용자가 지정한 임계값보다 작으면 선택
(closest_distance / next_closest_distance) < Threshold


여러 알고리즘을 테스트해보면 매칭으로 선별된 특징점이 잘못된 경우도 볼 수 있다. 이럴 경우 더 좋은 매칭 알고리즘을 구성해보아야한다.
인증 타임
여기서 나왔던 내용은 여기서 또 다른 알고리즘으로 테스트된 모습을 볼 수 있다.
살짝 변형된 사진인데도 불구하고 비슷한 특징점을 찾아낸다는 것이 정말 신기했다. 이러한 특징점 검출을 응용하는 프로그램을 이후에 배우게 되는거 같은데 어떤게 있을지 매우 궁금해진다.




#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online
패스트캠퍼스(FastCampus) 강의 둘러보러 가기
↓ ↓ ↓
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'남돈내배 > 2022_FastCampus_환급이벤트' 카테고리의 다른 글
| 패스트캠퍼스 챌린지 38일차 - Ch10. 객체 추적과 모션 벡터 (0) | 2022.03.02 |
|---|---|
| 패스트캠퍼스 챌린지 37일차 - Ch9. 특징점 검출과 매칭 (0) | 2022.03.01 |
| 패스트캠퍼스 챌린지 35일차 - Ch9. 특징점 검출과 매칭 (0) | 2022.02.27 |
| 패스트캠퍼스 챌린지 34일차 - Ch8. 영상 분할과 객체 검출 (0) | 2022.02.26 |
| 패스트캠퍼스 챌린지 33일차 - Ch8. 영상 분할과 객체 검출 (0) | 2022.02.25 |



