이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_surf_intro/py_surf_intro.html 입니다.
SURF는 SIFT의 수행 속도를 개선시킨 것으로, 분석에 따르면 대략 3배 정도 빠르다고 합니다.SURF는 이미지가 회전되거나 Blurring 처리가 되었을 때에 사용해도 잘 잘동하지만 밝기가 변경되거나 시점이 변경이 되면 적당하지 않습니다.
OpenCV에서 제공하는 SURF와 관련된 함수를 살펴보겠습니다.
import cv2 import numpy as np filename = './data/butterfly.jpg' img = cv2.imread(filename) gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) surf = cv2.xfeatures2d.SURF_create(50000) kp, des = surf.detectAndCompute(gray, None) print(len(kp)) img2 = cv2.drawKeypoints(gray,kp,None,(0,0,255),4) cv2.imshow('img2', img2) cv2.waitKey() cv2.destroyAllWindows()
위의 코드에서 이미지의 특징점을 추출하기 위한 SURF 기능을 사용하기 위해 8번 코드에서 SURF 객체를 생성합니다. 생성시 받는 인자는 Hessian 임계값으로 이 값이 작을수록 더 많은 특징점이 추출됩니다. 위 예제에서는 추출될 특징점 개수를 줄이기 위해 50000을 지정했으나 실제에서는 300-500 사이의 값을 지정합니다. 12번 코드에서 추출한 특징점의 개수를 출력하고 특징점을 이미지에 그리기 위해 14번 코드가 실행되었습니다. 결과는 다음과 같습니다.
위의 결과를 보면 특징점의 방향도 같이 표시되고 있는데, 방향이 필요없을 경우 속도 향상을 위해 방향 계산은 하지 않도록 할 수 있으며 아래 예제와 같습니다.
import cv2 import numpy as np filename = './data/butterfly.jpg' img = cv2.imread(filename) gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) surf = cv2.xfeatures2d.SURF_create(50000) surf.setUpright(True) kp, des = surf.detectAndCompute(gray, None) print(len(kp)) img2 = cv2.drawKeypoints(gray,kp,None,(0,0,255),4) cv2.imshow('img2', img2) cv2.waitKey() cv2.destroyAllWindows()
10번 코드를 통해 방향은 항상 위쪽 방향으로 간주하라고 지정합니다. 결과는 아래와 같습니다.