Berkeley SfM
Public Member Functions | Private Attributes | List of all members
bsfm::DescriptorExtractor Class Reference

#include <descriptor_extractor.h>

Public Member Functions

 DescriptorExtractor ()
 
 ~DescriptorExtractor ()
 
bool SetDescriptor (const std::string &descriptor_type)
 
bool DescribeFeatures (const Image &image, KeypointList &keypoints, std::vector< Feature > &features_out, std::vector< Descriptor > &descriptors_out)
 

Private Attributes

std::string descriptor_type_
 
cv::Ptr< cv::DescriptorExtractor > extractor_
 

Detailed Description

Definition at line 56 of file descriptor_extractor.h.

Constructor & Destructor Documentation

bsfm::DescriptorExtractor::DescriptorExtractor ( )
inline

Definition at line 59 of file descriptor_extractor.h.

59 { }
bsfm::DescriptorExtractor::~DescriptorExtractor ( )
inline

Definition at line 60 of file descriptor_extractor.h.

60 { }

Member Function Documentation

bool bsfm::DescriptorExtractor::DescribeFeatures ( const Image image,
KeypointList keypoints,
std::vector< Feature > &  features_out,
std::vector< Descriptor > &  descriptors_out 
)

Definition at line 71 of file descriptor_extractor.cpp.

74  {
75  // Make the user has called SetDescriptor().
76  if (descriptor_type_.empty()) {
77  VLOG(1)
78  << "Descriptor has not been specified via SetDescriptor(). Failed to "
79  "extract descriptors.";
80  return false;
81  }
82 
83  CHECK(extractor_) << "The descriptor extractor is null.";
84  features_out.clear();
85 
86  // Convert the input image to OpenCV's format. Note that descriptors must be
87  // extracted on the grayscale image, and that the image format must be CV_8U.
88  cv::Mat cv_image;
89  image.ToCV(cv_image);
90  cv_image.convertTo(cv_image, CV_8U, 255);
91 
92  // Extract descriptors from the provided keypoints in the image.
93  cv::Mat cv_descriptors;
94  try {
95  extractor_->compute(cv_image, keypoints, cv_descriptors);
96  } catch (const std::exception& e) {
97  VLOG(1) << "Failed to extract descriptors: " << e.what();
98  return false;
99  }
100 
101  // Convert the computed OpenCV-type descriptors and keypoints into a list of
102  // features and descriptors.
103  for (size_t ii = 0; ii < keypoints.size(); ++ii) {
104  Feature feature;
105  feature.u_ = keypoints[ii].pt.x;
106  feature.v_ = keypoints[ii].pt.y;
107  features_out.push_back(feature);
108 
109  MatrixXd descriptor_mat;
110  OpenCVToEigenMat<double>(cv_descriptors.row(ii), descriptor_mat);
111 
112  // Need to explicitly convert from matrix to vector.
113  Descriptor descriptor = descriptor_mat.row(0).transpose();
114  descriptors_out.push_back(descriptor);
115  }
116 
117  return true;
118 }
cv::Ptr< cv::DescriptorExtractor > extractor_
::Eigen::Matrix< double, Eigen::Dynamic, 1 > Descriptor
Definition: types.h:83
bool bsfm::DescriptorExtractor::SetDescriptor ( const std::string &  descriptor_type)

Definition at line 42 of file descriptor_extractor.cpp.

42  {
43  // Set the descriptor type.
44  descriptor_type_ = descriptor_type;
45  bool valid_descriptor_type = true;
46 
47  // Create an OpenCV descriptor extractor.
48  if (descriptor_type.compare("SIFT") == 0) {
49  extractor_ = cv::DescriptorExtractor::create("SIFT");
50  } else if (descriptor_type_.compare("SURF") == 0) {
51  extractor_ = cv::DescriptorExtractor::create("SURF");
52  } else if (descriptor_type_.compare("BRIEF") == 0) {
53  extractor_ = cv::DescriptorExtractor::create("BRIEF");
54  } else if (descriptor_type_.compare("BRISK") == 0) {
55  extractor_ = cv::DescriptorExtractor::create("BRISK");
56  } else if (descriptor_type_.compare("FREAK") == 0) {
57  extractor_ = cv::DescriptorExtractor::create("FREAK");
58  } else if (descriptor_type_.compare("ORB") == 0) {
59  extractor_ = cv::DescriptorExtractor::create("ORB");
60  } else {
61  VLOG(1) << "Descriptor type \"" << descriptor_type
62  << "\"is not available. Defaulting to SIFT.";
63  extractor_ = cv::DescriptorExtractor::create("SIFT");
64  valid_descriptor_type = false;
65  descriptor_type_ = "SIFT";
66  }
67 
68  return valid_descriptor_type;
69 }
cv::Ptr< cv::DescriptorExtractor > extractor_

Member Data Documentation

std::string bsfm::DescriptorExtractor::descriptor_type_
private

Definition at line 74 of file descriptor_extractor.h.

cv::Ptr<cv::DescriptorExtractor> bsfm::DescriptorExtractor::extractor_
private

Definition at line 75 of file descriptor_extractor.h.


The documentation for this class was generated from the following files: