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));
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)
491 ? std::numeric_limits<float>::max()
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;
520 float currentMin = std::numeric_limits<float>::max();
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);