32 #include "../point.hpp"
42 D2Histogram(
const std::vector<Eigen::Vector3f>& points,
int bins = 10) :
43 MAX_SAMPLES(100000), MAX_PAIRS(100000)
46 m_d2Histogram = makeHistogram(bins, calculateDistances(points));
49 D2Histogram(
const std::pair<std::string, std::vector<Eigen::Vector3f>>& points,
int bins = 10) :
50 MAX_SAMPLES(100000), MAX_PAIRS(100000)
53 m_d2Histogram = makeHistogram(bins, calculateDistances(points.second));
81 return compareHistograms(m_d2Histogram, casted->
d2Histogram());
90 serialize(
const ObjectSerializerBasePtr& serializer,
const Ice::Current&)
const
100 featureObj->setDoubleArray(
m_name, m_d2Histogram);
104 featureObj = obj->createElement();
105 featureObj->setDoubleArray(
m_name, m_d2Histogram);
111 deserialize(
const ObjectSerializerBasePtr& serializer,
const Ice::Current&)
116 featureObj->getDoubleArray(
m_name, m_d2Histogram);
119 virtual std::ostream&
124 if (!m_d2Histogram.empty())
126 out << m_d2Histogram[0];
128 for (
unsigned int i = 1; i < m_d2Histogram.size(); i++)
130 out <<
", " << m_d2Histogram[i];
139 const int MAX_SAMPLES;
143 normalize(
const std::vector<double>& x)
const
145 std::vector<double> n(x.size());
146 double max = *std::max_element(x.begin(), x.end());
148 for (
unsigned int i = 0; i < n.size(); i++)
157 compareHistograms(
const std::vector<double>&
a,
const std::vector<double>& b)
const
160 std::vector<double> an = normalize(
a);
161 std::vector<double> bn = normalize(b);
163 for (
unsigned int i = 0; i < an.size(); i++)
165 diff += std::pow(an[i] - bn[i], 2);
172 calculateDistances(
const std::vector<Eigen::Vector3f>& points)
const
174 int numPoints = points.size();
175 std::vector<int>
indices = std::vector<int>(
std::min(numPoints, MAX_SAMPLES));
177 if (numPoints < MAX_SAMPLES)
180 for (
unsigned int i = 0; i <
indices.size(); i++)
188 for (
unsigned int i = 0; i <
indices.size(); i++)
190 indices[i] = rand() % numPoints;
194 std::vector<double> distances = std::vector<double>(MAX_PAIRS);
197 int numIndices =
indices.size();
200 for (
int i = 0; i < MAX_PAIRS; i++)
202 first = rand() % numIndices;
207 second = rand() % numIndices;
208 }
while (first == second);
218 makeHistogram(
const int bins,
const std::vector<double>&
values)
const
220 std::vector<double> histogram(bins);
221 double width = *std::max_element(
values.begin(),
values.end()) / (double)bins;
223 for (
unsigned int i = 0; i <
values.size(); i++)
231 std::vector<double> m_d2Histogram;