You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.3 KiB
C++

/*
* feature implementation
*
* Copyright (C) HamidReza Houshiar
*
* Released under the GPL version 3.
*
*/
#include "slam6d/fbr/feature.h"
using namespace std;
namespace fbr{
feature::feature(){
fDetectorMethod = SIFT_DET;
fDescriptorMethod = SIFT_DES;
}
void feature::featureDetection(cv::Mat pImage, feature_detector_method method){
//Detect the keypoints using SURF Detector
if(fDetectorMethod == SURF_DET){
double minHessian = 400;
cv::SurfFeatureDetector detector(minHessian);
detector.detect(pImage, keypoints);
}
//Detect the keypoints using SIFT Detector
if(fDetectorMethod == SIFT_DET){
cv::SiftFeatureDetector detector;
detector.detect(pImage, keypoints);
}
//Detect the keypoints using ORB Detector
if(fDetectorMethod == ORB_DET){
cv::OrbFeatureDetector detector;
detector.detect(pImage, keypoints);
}
//Detect the keypoints using FAST Detector
if(fDetectorMethod == FAST_DET){
cv::FastFeatureDetector detector;
detector.detect(pImage, keypoints);
}
//Detect the keypoints using STAR Detector
if(fDetectorMethod == STAR_DET){
cv::StarFeatureDetector detector;
detector.detect(pImage, keypoints);
}
}
void feature::featureDetection(cv::Mat pImage){
featureDetection(pImage, fDetectorMethod);
}
void feature::featureDescription(cv::Mat pImage, feature_descriptor_method method){
if(keypoints.size() == 0)
featureDetection(pImage);
//Create descriptor using SURF
if(fDescriptorMethod == SURF_DES){
cv::SurfDescriptorExtractor extractor;
extractor.compute(pImage, keypoints, descriptors);
}
//Create descriptor using SIFT
if(fDescriptorMethod == SIFT_DES){
cv::SiftDescriptorExtractor extractor;
extractor.compute(pImage, keypoints, descriptors);
}
//Create descriptor using ORB
if(fDescriptorMethod == ORB_DES){
cv::OrbDescriptorExtractor extractor;
extractor.compute(pImage, keypoints, descriptors);
}
}
void feature::featureDescription(cv::Mat pImage){
featureDescription(pImage, fDescriptorMethod);
}
feature_detector_method feature::getDetectorMethod(){
return fDetectorMethod;
}
feature_descriptor_method feature::getDescriptorMethod(){
return fDescriptorMethod;
}
//check for the keypoints vector not to be empty
vector<cv::KeyPoint> feature::getFeatures(){
return keypoints;
}
//check for the descriptor Mat not to be empty
cv::Mat feature::getDescriptors(){
return descriptors;
}
void feature::getDescription(description_method method){
if(method == FEATURE_DESCRIPTION)
cout<<"fDetectorMethod: "<<featureDetectorMethodToString(fDetectorMethod)<<", number of detected features: "<<keypoints.size()<<"."<<endl;
else if(method == DESCRIPTOR_DESCRIPTION)
cout<<"fDescriptorMethod: "<<featureDescriptorMethodToString(fDescriptorMethod)<<"."<<endl;
else
cout<<"fDetectorMethod: "<<featureDetectorMethodToString(fDetectorMethod)<<", number of detected features: "<<keypoints.size()<<", fDescriptorMethod: "<<featureDescriptorMethodToString(fDescriptorMethod)<<"."<<endl;
cout<<endl;
}
unsigned int feature::getNumberOfFeatures(){
return keypoints.size();
}
}