31 #include <DataStructures/KdTree/KdTree.h>
32 #include <Tracking/ICP.h>
39 m_pKdTree =
new CKdTree();
41 m_nNumScenePoints = 0;
42 m_pValues =
new float*[1];
49 for (
int i = 0; i < m_nNumScenePoints; i++)
51 delete[] m_pValues[i];
61 m_aScenePoints.clear();
63 for (
int i = 0; i < m_nNumScenePoints; i++)
65 delete[] m_pValues[i];
72 const int nSize = aScenePoints.size();
74 for (
int i = 0; i < nSize; i++)
76 m_aScenePoints.push_back(aScenePoints.at(i));
79 m_pKdTree =
new CKdTree(nSize);
81 m_pValues =
new float*[nSize];
82 m_nNumScenePoints = nSize;
84 for (
int i = 0; i < nSize; i++)
86 m_pValues[i] =
new float[3];
87 m_pValues[i][0] = aScenePoints.at(i)[0];
88 m_pValues[i][1] = aScenePoints.at(i)[1];
89 m_pValues[i][2] = aScenePoints.at(i)[2];
92 m_pKdTree->Build(m_pValues, 0, nSize - 1, m_nKdTreeBucketSize, 3, 0);
98 m_aObjectPoints.clear();
100 for (
size_t i = 0; i < aObjectPoints.size(); i++)
102 m_aObjectPoints.push_back(aObjectPoints.at(i));
109 Math3d::SetMat(mRotation, Math3d::unit_mat);
110 Math3d::SetVec(vTranslation, 0, 0, 0);
112 if (m_aObjectPoints.size() < 3)
118 if (m_aScenePoints.size() < 3)
124 float fLastDistance = FLT_MAX;
125 float fDistance = 0, fPointDistance;
126 Vec3d vPoint, vPointTransformed;
127 float* pPointData =
new float[3];
128 float* pNearestNeighbor;
129 Vec3d* pPointPositions =
new Vec3d[m_aObjectPoints.size()];
130 Vec3d* pCorrespondingPointPositions =
new Vec3d[m_aObjectPoints.size()];
131 int nNumPointCorrespondences;
134 for (
int n = 0; n < m_nMaxIterations; n++)
137 nNumPointCorrespondences = 0;
140 for (
size_t i = 0; i < m_aObjectPoints.size(); i++)
142 Math3d::SetVec(vPoint,
143 m_aObjectPoints.at(i)[0],
144 m_aObjectPoints.at(i)[1],
145 m_aObjectPoints.at(i)[2]);
146 Math3d::MulMatVec(mRotation, vPoint, vTranslation, vPointTransformed);
148 pPointData[0] = vPointTransformed.x;
149 pPointData[1] = vPointTransformed.y;
150 pPointData[2] = vPointTransformed.z;
152 m_pKdTree->NearestNeighborBBF(pPointData, fPointDistance, pNearestNeighbor);
154 fPointDistance = sqrtf(fPointDistance);
157 if (fPointDistance > m_fCutoffDistance)
159 fDistance += m_fCutoffDistance;
163 fDistance += fPointDistance;
164 Math3d::SetVec(pPointPositions[nNumPointCorrespondences], vPoint);
165 Math3d::SetVec(pCorrespondingPointPositions[nNumPointCorrespondences],
168 pNearestNeighbor[2]);
169 nNumPointCorrespondences++;
173 if (nNumPointCorrespondences < 3)
175 ARMARX_WARNING_S <<
"CColorICP::SearchObject: not enough correspondences found!";
180 CICP::CalculateOptimalTransformation(pPointPositions,
181 pCorrespondingPointPositions,
182 nNumPointCorrespondences,
189 if (0.8f * fDistance < fBestDistanceUntilNow)
192 if (1.0f - fDistance / fLastDistance < 0.01f * m_fConvergenceDelta)
197 else if ((1.0f - fDistance / fLastDistance < m_fConvergenceDelta) ||
198 (2 * n > m_nMaxIterations))
203 else if ((0.5f * fDistance > fBestDistanceUntilNow) && (3 * n > m_nMaxIterations))
209 fLastDistance = fDistance;
215 delete[] pPointPositions;
216 delete[] pCorrespondingPointPositions;
218 return fDistance / m_aObjectPoints.size();
223 float fConvergenceDelta,
225 int nKdTreeBucketSize)
227 m_fCutoffDistance = fCutoffDistance;
228 m_fConvergenceDelta = fConvergenceDelta;
229 m_nMaxIterations = nMaxIterations;
230 m_nKdTreeBucketSize = nKdTreeBucketSize;
236 float* pPointData =
new float[3];
237 float* pNearestNeighbor;
240 for (
size_t i = 0; i < m_aObjectPoints.size(); i++)
242 pPointData[0] = m_aObjectPoints.at(i)[0];
243 pPointData[1] = m_aObjectPoints.at(i)[1];
244 pPointData[2] = m_aObjectPoints.at(i)[2];
246 m_pKdTree->NearestNeighborBBF(pPointData, fDistance, pNearestNeighbor);
248 aPointMatchDistances.push_back(fDistance);
256 std::vector<float>& aPointMatchDistances)
258 float* pPointData =
new float[3];
259 float* pNearestNeighbor;
260 Eigen::Vector3f pNearestNeighborPoint;
263 for (
size_t i = 0; i < m_aObjectPoints.size(); i++)
265 pPointData[0] = m_aObjectPoints.at(i)[0];
266 pPointData[1] = m_aObjectPoints.at(i)[1];
267 pPointData[2] = m_aObjectPoints.at(i)[2];
269 m_pKdTree->NearestNeighborBBF(pPointData, fDistance, pNearestNeighbor);
271 pNearestNeighborPoint[0] = pNearestNeighbor[0];
272 pNearestNeighborPoint[1] = pNearestNeighbor[1];
273 pNearestNeighborPoint[2] = pNearestNeighbor[2];
275 aNeighbors.push_back(pNearestNeighborPoint);
276 aPointMatchDistances.push_back(fDistance);