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

#include <distance_metric.h>

Public Types

enum  Metric { SCALED_L2, HAMMING }
 

Public Member Functions

void SetMetric (const Metric &metric=Metric::SCALED_L2)
 
void SetMaximumDistance (double maximum_distance)
 
double Max () const
 
double operator() (const Descriptor &descriptor1, const Descriptor &descriptor2)
 
bool MaybeNormalizeDescriptors (std::vector< Descriptor > &descriptors) const
 

Static Public Member Functions

static DistanceMetricInstance ()
 

Private Member Functions

 DistanceMetric ()
 
double GetScaledL2Distance (const Descriptor &descriptor1, const Descriptor &descriptor2) const
 
double GetHammingDistance (const Descriptor &descriptor1, const Descriptor &descriptor2) const
 
void NormalizeDescriptors (std::vector< Descriptor > &descriptors) const
 

Private Attributes

Metric metric_
 
double maximum_distance_
 

Detailed Description

Definition at line 58 of file distance_metric.h.

Member Enumeration Documentation

Enumerator
SCALED_L2 
HAMMING 

Definition at line 61 of file distance_metric.h.

Constructor & Destructor Documentation

bsfm::DistanceMetric::DistanceMetric ( )
private

Definition at line 91 of file distance_metric.cpp.

92  : maximum_distance_(std::numeric_limits<double>::max()) {
93  // Set metric to the default argument of SetMetric(), defined in the header.
94  SetMetric();
95 }
void SetMetric(const Metric &metric=Metric::SCALED_L2)

Member Function Documentation

double bsfm::DistanceMetric::GetHammingDistance ( const Descriptor descriptor1,
const Descriptor descriptor2 
) const
private

Definition at line 103 of file distance_metric.cpp.

104  {
105  CHECK_EQ(descriptor1.size(), descriptor2.size());
106  int sum = 0;
107  for (size_t ii = 0; ii < descriptor1.size(); ++ii) {
108  unsigned char d1 = static_cast<unsigned char>(descriptor1(ii));
109  unsigned char d2 = static_cast<unsigned char>(descriptor2(ii));
110  sum += d1 ^ d2;
111  }
112  return static_cast<double>(sum);
113 }
double bsfm::DistanceMetric::GetScaledL2Distance ( const Descriptor descriptor1,
const Descriptor descriptor2 
) const
private

Definition at line 97 of file distance_metric.cpp.

98  {
99  CHECK_EQ(descriptor1.size(), descriptor2.size());
100  return 1.0 - descriptor1.dot(descriptor2);
101 }
DistanceMetric & bsfm::DistanceMetric::Instance ( )
static

Definition at line 42 of file distance_metric.cpp.

42  {
43  static DistanceMetric instance;
44  return instance;
45 }
double bsfm::DistanceMetric::Max ( ) const

Definition at line 55 of file distance_metric.cpp.

55  {
56  return maximum_distance_;
57 }
bool bsfm::DistanceMetric::MaybeNormalizeDescriptors ( std::vector< Descriptor > &  descriptors) const

Definition at line 74 of file distance_metric.cpp.

75  {
76  bool normalized = false;
77  switch (metric_) {
78  case SCALED_L2:
79  NormalizeDescriptors(descriptors);
80  normalized = true;
81  break;
82  case HAMMING:
83  break;
84  // No default to catch incompatible types at compile time.
85  }
86 
87  return normalized;
88 }
void NormalizeDescriptors(std::vector< Descriptor > &descriptors) const
void bsfm::DistanceMetric::NormalizeDescriptors ( std::vector< Descriptor > &  descriptors) const
private

Definition at line 115 of file distance_metric.cpp.

116  {
117  for (auto& descriptor : descriptors) {
118  descriptor.normalize();
119  }
120 }
double bsfm::DistanceMetric::operator() ( const Descriptor descriptor1,
const Descriptor descriptor2 
)

Definition at line 59 of file distance_metric.cpp.

60  {
61  double distance = 0.0;
62  switch (metric_) {
63  case SCALED_L2:
64  distance = GetScaledL2Distance(descriptor1, descriptor2);
65  break;
66  case HAMMING:
67  distance = GetHammingDistance(descriptor1, descriptor2);
68  break;
69  // No default to catch incompatible types at compile time.
70  }
71  return distance;
72 }
double GetHammingDistance(const Descriptor &descriptor1, const Descriptor &descriptor2) const
double GetScaledL2Distance(const Descriptor &descriptor1, const Descriptor &descriptor2) const
void bsfm::DistanceMetric::SetMaximumDistance ( double  maximum_distance)

Definition at line 51 of file distance_metric.cpp.

51  {
52  maximum_distance_ = maximum_distance;
53 }
void bsfm::DistanceMetric::SetMetric ( const Metric metric = Metric::SCALED_L2)

Definition at line 47 of file distance_metric.cpp.

47  {
48  metric_ = metric;
49 }

Member Data Documentation

double bsfm::DistanceMetric::maximum_distance_
private

Definition at line 122 of file distance_metric.h.

Metric bsfm::DistanceMetric::metric_
private

Definition at line 117 of file distance_metric.h.


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