49 Keypoint::Keypoint(
float x,
float y,
unsigned int id,
const std::string& name,
float confidence) :
56 const std::string& name,
58 _id(id), _name(name), _dominantColor(DrawColor24Bit{0, 0, 0})
61 setConfidence(confidence);
67 const std::string& name,
69 _id(id), _name(name), _dominantColor(DrawColor24Bit{0, 0, 0})
71 setStereo2D(left, right);
72 setConfidence(confidence);
78 return _pos3D ? true :
false;
84 return !_pointR.
isnan();
111 _confidence = confidence;
117 _dominantColor = color;
126 std::pair<Point2D, Point2D>
130 return std::make_pair(_pointL, _pointR);
148 return _dominantColor;
166 std::stringstream ss;
168 ss <<
"Name: " << _name <<
", ";
169 ss <<
"x: " << _pointL.
_x <<
", ";
170 ss <<
"y: " << _pointL.
_y <<
", ";
171 ss <<
"Confindence: " << _confidence;
175 KeypointSetById::const_iterator
178 return _keypoints.get<0>().
begin();
181 KeypointSetById::const_iterator
184 return _keypoints.get<0>().
end();
190 auto itFound = _keypoints.get<1>().find(nodeName);
191 if (itFound != _keypoints.get<1>().end())
204 auto itFound = _keypoints.get<0>().find(
id);
205 if (itFound != _keypoints.get<0>().end())
220 _keypoints.insert(point);
227 _keypoints.get<1>().erase(nodeName);
233 _keypoints.get<0>().erase(
id);
239 return _keypoints.get<0>().
size();
247 return std::numeric_limits<float>::quiet_NaN();
250 int amountDepths = 0;
256 result += point->get3D()->z;
259 return result /
static_cast<float>(amountDepths);
265 Keypoint2DMap iceMap;
266 for (
auto [
id, label] : idNameMap)
271 Keypoint2D iceKeypoint;
272 iceKeypoint.x = keypoint->get2D()._x;
273 iceKeypoint.y = keypoint->get2D()._y;
274 iceKeypoint.label = keypoint->getName();
275 iceKeypoint.confidence = keypoint->getConfidence();
276 iceKeypoint.dominantColor = keypoint->getDominantColor();
277 iceMap.insert(std::make_pair(iceKeypoint.label, iceKeypoint));
281 Keypoint2D iceKeypoint;
282 iceKeypoint.x = 0.0f;
283 iceKeypoint.y = 0.0f;
284 iceKeypoint.label = label;
285 iceKeypoint.confidence = 0.0f;
286 iceKeypoint.dominantColor = DrawColor24Bit{0, 0, 0};
287 iceMap.insert(std::make_pair(iceKeypoint.label, iceKeypoint));
296 Keypoint3DMap iceMap;
297 for (
auto [
id, label] : idNameMap)
300 if (keypoint && keypoint->is3DSet())
302 Keypoint3D iceKeypoint;
303 iceKeypoint.x = keypoint->get3D()->x;
304 iceKeypoint.y = keypoint->get3D()->y;
305 iceKeypoint.z = keypoint->get3D()->z;
307 Eigen::Vector3f globalPose = keypoint->get3D()->toGlobalEigen(local_robot);
309 iceKeypoint.globalX = globalPose(0);
310 iceKeypoint.globalY = globalPose(1);
311 iceKeypoint.globalZ = globalPose(2);
313 iceKeypoint.label = keypoint->getName();
314 iceKeypoint.confidence = keypoint->getConfidence();
315 iceKeypoint.dominantColor = keypoint->getDominantColor();
316 iceMap.insert(std::make_pair(keypoint->getName(), iceKeypoint));
320 Keypoint3D iceKeypoint;
321 iceKeypoint.x = 0.0f;
322 iceKeypoint.y = 0.0f;
323 iceKeypoint.z = 0.0f;
324 iceKeypoint.globalX = 0.0f;
325 iceKeypoint.globalY = 0.0f;
326 iceKeypoint.globalZ = 0.0f;
327 iceKeypoint.label = label;
328 iceKeypoint.confidence = 0.0f;
329 iceKeypoint.dominantColor = DrawColor24Bit{0, 0, 0};
330 iceMap.insert(std::make_pair(iceKeypoint.label, iceKeypoint));
343 KeypointPtr otherPoint =
object->getNode(keypoint->getId());
347 keypoint->setStereo2D(keypoint->get2D(), otherPoint->get2D());
349 keypoint->setConfidence((keypoint->getConfidence() + otherPoint->getConfidence()) /
359 std::stringstream ss;
362 ss << keypoint->toString2D() <<
"\n";
378 Keypoint2DMapList
list;
381 list.push_back(o->toIce2D(_idNameMap));
390 for (Keypoint2DMap map :
list)
392 for (
auto pair : map)
394 Keypoint2D point = pair.second;
395 if (point.x < 0.0f || point.x > width || point.y < 0.0f || point.y > height)
402 point.x = point.x /
static_cast<float>(width);
403 point.y = point.y /
static_cast<float>(height);
413 Keypoint3DMapList
list;
416 list.push_back(o->toIce3D(_idNameMap, local_robot));
431 size_t leftSize =
getData().size();
432 size_t rightSize = other->getData().size();
436 if (leftSize == 0 || rightSize == 0)
441 std::vector<KeypointObjectPtr> moreObjects;
442 std::vector<KeypointObjectPtr> lessObjects;
443 if (leftSize > rightSize)
446 lessObjects = other->getData();
450 moreObjects = other->getData();
455 if (leftSize == 1 && rightSize == 1)
463 Eigen::MatrixXf personDistances(lessObjects.size(),
465 Eigen::MatrixXf validKeypointsRatio(
470 for (
unsigned int l = 0; l < lessObjects.size(); l++)
473 for (
unsigned int r = 0; r < moreObjects.size(); r++)
477 int addedDistances = 0;
483 sum += std::pow(kpl->get2D()._x - kpr->get2D()._x, 2) +
484 std::pow(kpr->get2D()._y - kpr->get2D()._y,
490 personDistances(l, r) = (addedDistances == 0)
492 :
static_cast<float>(sum) / addedDistances;
495 int validKeypointsPL =
static_cast<int>(pl->size());
496 int validKeypointsPR =
static_cast<int>(pr->size());
497 if (validKeypointsPL == 0 || validKeypointsPR == 0)
499 validKeypointsRatio(l, r) =
502 else if (validKeypointsPL > validKeypointsPR)
504 validKeypointsRatio(l, r) =
505 static_cast<float>(validKeypointsPR) /
static_cast<float>(validKeypointsPL);
509 validKeypointsRatio(l, r) =
510 static_cast<float>(validKeypointsPR) /
static_cast<float>(validKeypointsPL);
516 std::vector<unsigned int> numbers(moreObjects.size());
517 std::iota(numbers.begin(), numbers.end(), 0);
519 std::vector<unsigned int> bestPermutation;
524 for (
unsigned int i = 0; i < lessObjects.size(); i++)
527 personDistances(i, numbers.at(i)) /
528 static_cast<float>(std::pow(
529 validKeypointsRatio(i, numbers.at(i)),
532 if (sum < currentMin)
535 bestPermutation = numbers;
538 numbers.begin() +
static_cast<long>(lessObjects.size()),
541 }
while (std::next_permutation(numbers.begin(), numbers.end()));
544 if (!bestPermutation.empty())
546 if (leftSize <= rightSize)
548 for (
unsigned int i = 0; i < this->
getData().size(); i++)
552 left->matchWith(right);
557 for (
unsigned int i = 0; i < other->getData().size(); i++)
561 left->matchWith(right);
570 if (n > _objects.size())
574 std::sort(_objects.begin(),
577 { return o1->getAverageDepth() < o2->getAverageDepth(); });