forked from 170010011/fr
31 lines
900 B
Python
31 lines
900 B
Python
# import the necessary packages
|
|
from __future__ import absolute_import
|
|
import numpy as np
|
|
import cv2
|
|
from ..convenience import is_cv2
|
|
|
|
class RootSIFT:
|
|
def __init__(self):
|
|
# initialize the SIFT feature extractor for OpenCV 2.4
|
|
if is_cv2():
|
|
self.extractor = cv2.DescriptorExtractor_create("SIFT")
|
|
|
|
# otherwise initialize the SIFT feature extractor for OpenCV 3+
|
|
else:
|
|
self.extractor = cv2.xfeatures2d.SIFT_create()
|
|
|
|
def compute(self, image, kps, eps=1e-7):
|
|
# compute SIFT descriptors
|
|
(kps, descs) = self.extractor.compute(image, kps)
|
|
|
|
# if there are no keypoints or descriptors, return an empty tuple
|
|
if len(kps) == 0:
|
|
return ([], None)
|
|
|
|
# apply the Hellinger kernel by first L1-normalizing and taking the
|
|
# square-root
|
|
descs /= (descs.sum(axis=1, keepdims=True) + eps)
|
|
descs = np.sqrt(descs)
|
|
|
|
# return a tuple of the keypoints and descriptors
|
|
return (kps, descs) |