124 lines
4.7 KiB
Python
124 lines
4.7 KiB
Python
from ..convenience import is_cv2
|
|
import cv2
|
|
from .dense import DENSE
|
|
from .gftt import GFTT
|
|
from .harris import HARRIS
|
|
from .rootsift import RootSIFT
|
|
|
|
if is_cv2():
|
|
def FeatureDetector_create(method):
|
|
method = method.upper()
|
|
if method == "DENSE":
|
|
return DENSE()
|
|
elif method == "GFTT":
|
|
return GFTT()
|
|
elif method == "HARRIS":
|
|
return HARRIS()
|
|
return cv2.FeatureDetector_create(method)
|
|
|
|
def DescriptorExtractor_create(method):
|
|
method = method.upper()
|
|
if method == "ROOTSIFT":
|
|
return RootSIFT()
|
|
return cv2.DescriptorExtractor_create(method)
|
|
|
|
def DescriptorMatcher_create(method):
|
|
return cv2.DescriptorMatcher_create(method)
|
|
|
|
else:
|
|
try:
|
|
_DETECTOR_FACTORY = {"BRISK": cv2.BRISK_create,
|
|
"DENSE": DENSE,
|
|
"FAST": cv2.FastFeatureDetector_create,
|
|
"GFTT": GFTT,
|
|
"HARRIS": HARRIS,
|
|
"MSER": cv2.MSER_create,
|
|
"ORB": cv2.ORB_create,
|
|
"SIFT": cv2.xfeatures2d.SIFT_create,
|
|
"SURF": cv2.xfeatures2d.SURF_create,
|
|
"STAR": cv2.xfeatures2d.StarDetector_create
|
|
}
|
|
|
|
_EXTRACTOR_FACTORY = {"SIFT": cv2.xfeatures2d.SIFT_create,
|
|
"ROOTSIFT": RootSIFT,
|
|
"SURF": cv2.xfeatures2d.SURF_create,
|
|
"BRIEF": cv2.xfeatures2d.BriefDescriptorExtractor_create,
|
|
"ORB": cv2.ORB_create,
|
|
"BRISK": cv2.BRISK_create,
|
|
"FREAK": cv2.xfeatures2d.FREAK_create
|
|
}
|
|
|
|
_MATCHER_FACTORY = {"BruteForce": cv2.DESCRIPTOR_MATCHER_BRUTEFORCE,
|
|
"BruteForce-SL2": cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_SL2,
|
|
"BruteForce-L1": cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_L1,
|
|
"BruteForce-Hamming": cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING,
|
|
"FlannBased": cv2.DESCRIPTOR_MATCHER_FLANNBASED
|
|
}
|
|
|
|
except AttributeError:
|
|
_DETECTOR_FACTORY = {"MSER": cv2.MSER_create,
|
|
"FAST": cv2.FastFeatureDetector_create,
|
|
"BRISK": cv2.BRISK_create,
|
|
"ORB": cv2.ORB_create,
|
|
"GFTT": GFTT,
|
|
"HARRIS": HARRIS,
|
|
"DENSE": DENSE
|
|
}
|
|
|
|
_EXTRACTOR_FACTORY = {"ORB": cv2.ORB_create,
|
|
"BRISK": cv2.BRISK_create
|
|
}
|
|
|
|
_CONTRIB_FUNCS = {"SIFT", "ROOTSIFT", "SURF", "STAR", "BRIEF", "FREAK"}
|
|
|
|
|
|
def FeatureDetector_create(detector, *args, **kw_args):
|
|
"""
|
|
|
|
:param detector: string of the type of keypoint detector to return
|
|
:param args: positional arguments for detector
|
|
:param kw_args: keyword arguments for detector
|
|
:return: the key point detector object
|
|
"""
|
|
try:
|
|
detr = _DETECTOR_FACTORY[detector.upper()]
|
|
except KeyError:
|
|
if detector.upper() in _CONTRIB_FUNCS:
|
|
msg = "OpenCV needs to be compiled with opencv_contrib to support {}".format(detector)
|
|
raise AttributeError(msg)
|
|
raise AttributeError("{} not a supported detector".format(detector))
|
|
|
|
return detr(*args, **kw_args)
|
|
|
|
|
|
def DescriptorExtractor_create(extractor, *args, **kw_args):
|
|
"""
|
|
|
|
:param extractor: string of the type of descriptor extractor to return
|
|
:param args: positional arguments for extractor
|
|
:param kw_args: keyword arguments for extractor
|
|
:return: the key extractor object
|
|
"""
|
|
try:
|
|
extr = _EXTRACTOR_FACTORY[extractor.upper()]
|
|
except KeyError:
|
|
if extractor.upper() in _CONTRIB_FUNCS:
|
|
msg = "OpenCV needs to be compiled with opencv_contrib to support {}".format(extractor)
|
|
raise AttributeError(msg)
|
|
raise AttributeError("{} not a supported extractor".format(extractor))
|
|
|
|
return extr(*args, **kw_args)
|
|
|
|
def DescriptorMatcher_create(matcher):
|
|
"""
|
|
|
|
:param matcher: string of the type of descriptor matcher to return
|
|
:return: the matcher int
|
|
"""
|
|
try:
|
|
extr = _MATCHER_FACTORY[matcher]
|
|
except KeyError:
|
|
raise AttributeError("{} not a supported matcher".format(matcher))
|
|
|
|
return cv2.DescriptorMatcher_create(extr)
|