32 #include "../point.hpp"
42 A3Histogram(
const std::vector<Eigen::Vector3f>& points,
int bins = 10) :
43 MAX_SAMPLES(100000), MAX_TRIOS(100000)
46 m_a3Histogram = makeHistogram(bins, calculateAngles(points));
49 A3Histogram(
const std::pair<std::string, std::vector<Eigen::Vector3f>>& points,
int bins = 10) :
50 MAX_SAMPLES(100000), MAX_TRIOS(100000)
53 m_a3Histogram = makeHistogram(bins, calculateAngles(points.second));
81 return compareHistograms(m_a3Histogram, casted->
a3Histogram());
90 serialize(
const ObjectSerializerBasePtr& serializer,
const Ice::Current&)
const
100 featureObj->setDoubleArray(
m_name, m_a3Histogram);
104 featureObj = obj->createElement();
105 featureObj->setDoubleArray(
m_name, m_a3Histogram);
111 deserialize(
const ObjectSerializerBasePtr& serializer,
const Ice::Current&)
116 featureObj->getDoubleArray(
m_name, m_a3Histogram);
119 virtual std::ostream&
124 if (!m_a3Histogram.empty())
126 out << m_a3Histogram[0];
128 for (
unsigned int i = 1; i < m_a3Histogram.size(); i++)
130 out <<
", " << m_a3Histogram[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 calculateAngles(
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> angles(MAX_TRIOS);
198 int numIndices =
indices.size();
201 for (
int i = 0; i < MAX_TRIOS; i++)
203 first = rand() % numIndices;
208 second = rand() % numIndices;
209 }
while (first == second);
213 third = rand() % numIndices;
214 }
while (first == third || second == third);
225 makeHistogram(
const int bins,
const std::vector<double>&
values)
const
227 std::vector<double> histogram(bins);
228 double width = *std::max_element(
values.begin(),
values.end()) / (double)bins;
230 for (
unsigned int i = 0; i <
values.size(); i++)
238 std::vector<double> m_a3Histogram;