40 #include <glog/logging.h>
49 cv::initModule_nonfree();
55 bool valid_detector_type =
true;
58 if (detector_type.compare(
"SURF") == 0) {
61 cv::Ptr<cv::AdjusterAdapter> adjuster(
62 cv::AdjusterAdapter::create(
"SURF"));
64 cv::Ptr<cv::FeatureDetector>(
new cv::DynamicAdaptedFeatureDetector(
67 detector_ = cv::FeatureDetector::create(
"SURF");
70 }
else if (detector_type.compare(
"FAST") == 0) {
73 cv::Ptr<cv::AdjusterAdapter> adjuster(
74 cv::AdjusterAdapter::create(
"FAST"));
76 cv::Ptr<cv::FeatureDetector>(
new cv::DynamicAdaptedFeatureDetector(
79 detector_ = cv::FeatureDetector::create(
"FAST");
82 }
else if (detector_type.compare(
"STAR") == 0) {
85 cv::Ptr<cv::AdjusterAdapter> adjuster(
86 cv::AdjusterAdapter::create(
"STAR"));
88 cv::Ptr<cv::FeatureDetector>(
new cv::DynamicAdaptedFeatureDetector(
91 detector_ = cv::FeatureDetector::create(
"STAR");
94 }
else if (detector_type.compare(
"SIFT") == 0) {
96 detector_ = cv::FeatureDetector::create(
"SIFT");
98 }
else if (detector_type.compare(
"ORB") == 0) {
100 detector_ = cv::FeatureDetector::create(
"ORB");
102 }
else if (detector_type.compare(
"BRISK") == 0) {
104 detector_ = cv::FeatureDetector::create(
"BRISK");
106 }
else if (detector_type.compare(
"MSER") == 0) {
108 detector_ = cv::FeatureDetector::create(
"MSER");
110 }
else if (detector_type.compare(
"GFTT") == 0) {
112 detector_ = cv::FeatureDetector::create(
"GFTT");
114 }
else if (detector_type.compare(
"HARRIS") == 0) {
116 detector_ = cv::FeatureDetector::create(
"HARRIS");
118 }
else if (detector_type.compare(
"DENSE") == 0) {
120 detector_ = cv::FeatureDetector::create(
"Dense");
122 }
else if (detector_type.compare(
"SIMPLEBLOB") == 0) {
124 detector_ = cv::FeatureDetector::create(
"SimpleBlob");
127 VLOG(1) <<
"Detector type \"" << detector_type
128 <<
"\"is not available. Defaulting to FAST.";
132 cv::Ptr<cv::AdjusterAdapter> adjuster(
133 cv::AdjusterAdapter::create(
"FAST"));
135 cv::Ptr<cv::FeatureDetector>(
new cv::DynamicAdaptedFeatureDetector(
138 detector_ = cv::FeatureDetector::create(
"FAST");
141 valid_detector_type =
false;
145 return valid_detector_type;
152 VLOG(1) <<
"Detector has not been specified via SetDetector(). Failed to "
156 CHECK(
detector_) <<
"The feature detector is null.";
159 keypoints_out.clear();
164 image.
ToCV(cv_image);
165 cv_image.convertTo(cv_image, CV_8U, 255);
169 detector_->detect(cv_image, keypoints_out);
170 }
catch (
const std::exception& e) {
171 VLOG(1) <<
"Failed to detect keypoints: " << e.what();
180 unsigned int iters) {
183 <<
"\" does not support adaptive feature count adjustment. Type "
184 "must be one of {FAST, SURF, STAR}";
203 <<
"\" does not support adaptive feature count adjustment, and "
204 "therefore is already static.";
bool DetectKeypoints(const Image &image, KeypointList &keypoints_out)
cv::Ptr< cv::FeatureDetector > detector_
unsigned int adaptive_iters_
unsigned int adaptive_max_
bool SupportsAdaptiveAdjustment() const
unsigned int adaptive_min_
::std::vector< Keypoint > KeypointList
bool SetDetector(const std::string &detector_type)
std::string detector_type_
void ToCV(cv::Mat &out) const
void SetAdaptiveOn(unsigned int min, unsigned int max, unsigned int iters)