Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 특징점 기술과 KAZE, AKAZE, ORB 알고리즘 성능 비교 - cv2.Feature2D.compute

AI 꿈나무 2020. 10. 17. 14:26
반응형

특징점 기술

 OpenCV로 영상의 특징점을 기술하는 방법을 공부하기 전에 기술자 or 특징벡터에 대하여 먼저 공부하겠습니다.

 

1. 기술자 - Descriptor, Feature vector

 기술자는 특징벡터라는 용어로 같이 이용되고 있습니다.

 

 기술자는 검출된 특징점 근방의 부분 영상을 표현하는 실수 또는 이진 벡터를 의미합니다.

 실수값으로 표현한 영상의 모양 혹은 색상 분포로 이해하면 됩니다.

 OpenCV에서는 2차원 행렬(numpy.ndarray)로 표현합니다.

 행 개수는 특징점 개수, 열 개수는 특징점 기술자 알고리즘에 의해 다르게 정의됩니다.

 

 

 

 KAZE 특징점 검출 방법으로 3159개의 특징점을 검출했습니다.

 이런 경우에 행은 3159개 열은 64개입니다.

 float32 이므로 하나 당 4바이트이고 64열이므로 4 X 64 바이트가 특징점 하나를 표시하는데 필요한 데이터입니다.

 특징점이 3159개 있으므로 4 X 64 X 3159 바이트를 차지하게 됩니다.

 

 표현 방식은 1. 실수값 2. 이진벡터 두 가지가 있습니다.

 실수값을 많이 이용하지만 최근에는 이진벡터를 이용하는 방법도 많이 이용하고 있습니다.

 

2. 실수 기술자

 기술자를 실수값으로 표현한 것을 실수 기술자라고 합니다.

 

 numpy.float32 자료형을 사용하여 실수 정보를 저장하는 방식입니다.

 실수 기술자를 사용하는 알고리즘은 SIFT, SURF, KAZE 등이 있습니다.

 실수 기술자는 보통 L2 노름(L2 norm)을 사용하여 유사도를 판단합니다.

 

[작동방법]

 

 

 특징점 부근에 특징점 키포인트 객체 반환값 사이즈에 있는 멤버 변수를 이용해서 적절한 크기의 부분영상을 추출합니다.

 부분영상을 16X16로 분할하고 그레디언트 방향성분에 대한 히스토그램을 추출합니다.

 부분 영상에 대해서 각각의 작은 사각형에서 방향 히스토그램을 계산 합니다.

 방향 히스토그램을 4X4 단위로 모아서 45도씩 8개의 방향으로 표현합니다.

 이처럼 방향 성분으로 부분 영상의 특징을 기술합니다.

 

3. 이진 기술자 - Binary desciptor

 이진 테스트(Binary test)를 이용하여 부분 영상의 특징을 기술하는 방법입니다.

 

 보통 numpy.unit8 자료형을 사용하여 비트 단위로 영상 특징 정보를 저장하는 방식입니다.

 이진 기술자를 사용하는 알고리즘은 AKAZE, ORB, BRIEF 등이 있습니다.

 이진 기술자는 해밍 거리(Hamming distance)를 사용하여 유사도를 판단합니다.

 

[작동 방법]

 

 

 특징점 주변 부분 영상을 짤라냅니다.

 부분 영상안에서 미리 정의해둔 점을 고정 시켜둡니다.

 1번, 2번, 3번점 각각의 밝기를 비교합니다.

 1번과 2번 중 1번이 더 밝으면 1로 기술

 2번과 3번 중 2번이 더 어두우면 0으로 기술

 1번과 3번 중 1번이 더 밝으므로 1으로 기술

 정보를 취합하면 [1 0 1] 3비트 자료가 되는데 이 것으로 부분 영상의 특징을 기술하는 것입니다.

 기본적으로 밝기 차이 값들을 이진수로 표현한 것입니다.

 

4. 특징점 기술자 계산 함수 - cv2.Feature2D.compute

 Feature2D 클래스에 구현되어 있는 compute 함수를 이용하여 기술자를 계산할 수 있습니다.

 .Detect 함수로 구한 키포인트 객체를 입력 값으로 사용합니다.

 

cv2.Feature2D.compute(image, keypoints, descriptors=None) -> keypoints, descriptors

• image: 입력 영상

• keypoints: 검출된 특징점 정보. cv2.KeyPoint 객체의 리스트.

• descriptors: 특징점 기술자 행렬

5. 특징점 검출 및 기술자 계산 함수 - cv2.Feature2D.detectAndCompute

 특징점 검출과 기술자 계산을 동시에 지원하는 함수가 있습니다.

 

cv2.Feature2D.detectAndCompute(image, mask=None, descriptors=None) -> keypoints, descriptors

• image: 입력 영상

• mask: 마스크 영상

• keypoints: 검출된 특징점 정보. cv2.KeyPoint 객체의 리스트.

• descriptors: 특징점 기술자 행렬

 주의할 점은 디텍션만 가능한 알고리즘에 detectAndCompute 함수를 적용하면 프로그램이 종요됩니다.

 검출과 기술자 계산이 둘 다 가능한 알고리즘에 이용해야 합니다.

 

6. 특징점 기술자 계산 예제

예제 코드 출처 :  황선규 박사님 github홈페이지 sunkyoo.github.io/opencv4cvml/

 

# 영상 불러오기
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()
#feature = cv2.AKAZE_create()
# ORB방법은 특징점 검출 갯수 지정 가능, 기본값 500개
#feature = cv2.ORB_create()

# 특징점 검출 및 기술자 계산
kp1 = feature.detect(src1) # 디텍트
_, desc1 = feature.compute(src1, kp1) # 컴퓨트

kp2, desc2 = feature.detectAndCompute(src2, None) # 둘다 이용

# 반환값 세이프랑 타입을 출력
print('desc1.shape:', desc1.shape) # 카제 (3159, 64) 어카제 2418,61 ORB (500,32)
print('desc1.dtype:', desc1.dtype) # 카제 float32    어카제 unit8   ORB unit8
print('desc2.shape:', desc2.shape) # 카제 (3625, 64) 어카제(2884,61 ORB (500, 32)
print('desc2.dtype:', desc2.dtype) # 카제 flot.64    어카제 unit8   ORB unit8 1바이트

# 검출된 특징점 출력 영상 생성
dst1 = cv2.drawKeypoints(src1, kp1, None,
                         flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
dst2 = cv2.drawKeypoints(src2, kp2, None,
                         flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()

 

 

 

7. OpenCV 주요 특징점 알고리즘과 기술자 특성

 

8. 특징점 검출 알고리즘 성능 비교

(1) 연산 속도 비교

 

 

 ORB는 내부적으로 FAST 알고리즘이 구현되어 있기 때문에 제일 빠릅니다.

 

(2) 반복 검출율 비교

 

 

(3) 특징점 검출 알고리즘 성능 비교

 

 

 ORB는 매칭 퀄리티, 검출 결과가 안좋지만 속도가 빨라 자주 이용하고 있습니다.

 매칭하는 성능에 있어서는 AKAZE가 더 좋습니다.

 매칭 성능은 SHIFT가 가장 좋지만 연산 시간이 제일 느립니다.

 


OpenCV 튜토리얼과 황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.

docs.opencv.org/4.3.0/db/d27/tutorial_py_table_of_contents_feature2d.html

 

OpenCV: Feature Detection and Description

Feature Matching We know a great deal about feature detectors and descriptors. It is time to learn how to match different descriptors. OpenCV provides two techniques, Brute-Force matcher and FLANN based matcher.

docs.opencv.org

 

반응형