From 924e062426415a8596cd66ea896b8b3a4a9be9de Mon Sep 17 00:00:00 2001 From: edgarriba <edgar.riba@gmail.com> Date: Wed, 30 Jul 2014 12:53:24 +0200 Subject: [PATCH] Code tutorial --- .../include/RobustMatcher.h | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/include/RobustMatcher.h diff --git a/samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/include/RobustMatcher.h b/samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/include/RobustMatcher.h new file mode 100644 index 0000000000..fc03c74faa --- /dev/null +++ b/samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/include/RobustMatcher.h @@ -0,0 +1,83 @@ +/* + * RobustMatcher.h + * + * Created on: Jun 4, 2014 + * Author: eriba + */ + +#ifndef ROBUSTMATCHER_H_ +#define ROBUSTMATCHER_H_ + +#include <iostream> +#include <boost/shared_ptr.hpp> + +#include <opencv2/core/core.hpp> +#include <opencv2/highgui/highgui.hpp> +#include <opencv2/features2d/features2d.hpp> +#include <opencv2/nonfree/nonfree.hpp> + +class RobustMatcher { +public: + RobustMatcher() : ratio_(0.8f) + { + // ORB is the default feature + detector_ = new cv::OrbFeatureDetector(); + extractor_ = new cv::OrbDescriptorExtractor(); + + // BruteFroce matcher with Norm Hamming is the default matcher + matcher_ = new cv::BFMatcher(cv::NORM_HAMMING, false); + + } + virtual ~RobustMatcher(); + + // Set the feature detector + void setFeatureDetector(cv::FeatureDetector * detect) { detector_ = detect; } + + // Set the descriptor extractor + void setDescriptorExtractor(cv::DescriptorExtractor * desc) { extractor_ = desc; } + + // Set the matcher + void setDescriptorMatcher(cv::DescriptorMatcher * match) { matcher_ = match; } + + // Compute the keypoints of an image + void computeKeyPoints( const cv::Mat& image, std::vector<cv::KeyPoint>& keypoints); + + // Compute the descriptors of an image given its keypoints + void computeDescriptors( const cv::Mat& image, std::vector<cv::KeyPoint>& keypoints, cv::Mat& descriptors); + + // Set ratio parameter for the ratio test + void setRatio( float rat) { ratio_ = rat; } + + // Clear matches for which NN ratio is > than threshold + // return the number of removed points + // (corresponding entries being cleared, + // i.e. size will be 0) + int ratioTest(std::vector<std::vector<cv::DMatch> > &matches); + + // Insert symmetrical matches in symMatches vector + void symmetryTest( const std::vector<std::vector<cv::DMatch> >& matches1, + const std::vector<std::vector<cv::DMatch> >& matches2, + std::vector<cv::DMatch>& symMatches ); + + // Match feature points using ratio and symmetry test + void robustMatch( const cv::Mat& frame, std::vector<cv::DMatch>& good_matches, + std::vector<cv::KeyPoint>& keypoints_frame, + const cv::Mat& descriptors_model ); + + // Match feature points using ratio test + void fastRobustMatch( const cv::Mat& frame, std::vector<cv::DMatch>& good_matches, + std::vector<cv::KeyPoint>& keypoints_frame, + const cv::Mat& descriptors_model ); + +private: + // pointer to the feature point detector object + cv::FeatureDetector * detector_; + // pointer to the feature descriptor extractor object + cv::DescriptorExtractor * extractor_; + // pointer to the matcher object + cv::DescriptorMatcher * matcher_; + // max ratio between 1st and 2nd NN + float ratio_; +}; + +#endif /* ROBUSTMATCHER_H_ */