363 const CByteImage* pNewCamImageRight,
364 const double* pSensorConfig,
365 double* pEstimatedConfig,
366 double& dConfidenceRating)
368 Mat3d mTemp1, mTemp2, mTemp3, mTemp4;
388 m_pSensorConf[i] = pSensorConfig[i];
390 configMutex.unlock();
392 m_pParticleFilter->SetSensorConfig(m_pSensorConf);
398#pragma omp parallel sections
402 ImageProcessor::CalculateHSVImage(pNewCamImageLeft, m_pHSVImageLeft);
403 ImageProcessor::FilterHSV(m_pHSVImageLeft,
405 default_fingertip_hue,
406 default_fingertip_hue_tolerance,
407 default_fingertip_sat_min,
408 default_fingertip_sat_max,
409 default_fingertip_val_min,
410 default_fingertip_val_max);
417 ImageProcessor::CalculateHSVImage(pNewCamImageRight, m_pHSVImageRight);
418 ImageProcessor::FilterHSV(m_pHSVImageRight,
420 default_fingertip_hue,
421 default_fingertip_hue_tolerance,
422 default_fingertip_sat_min,
423 default_fingertip_sat_max,
424 default_fingertip_val_min,
425 default_fingertip_val_max);
432 ImageProcessor::ConvertImage(pNewCamImageLeft, m_pTempGrayImage3);
433 ImageProcessor::CalculateGradientImageSobel(m_pTempGrayImage3, m_pTempGrayImage4);
434 for (
int i = 0; i < m_pTempGrayImage4->width * m_pTempGrayImage4->height; i++)
436 m_pTempGrayImage4->pixels[i] = 15 * sqrt(m_pTempGrayImage4->pixels[i]);
439#ifdef DSHT_USE_EDGE_DIRECTION
440 ImageProcessor::SobelX(m_pTempGrayImage3, m_pTempGrayImage4,
false);
441 ImageProcessor::GaussianSmooth3x3(m_pTempGrayImage4, m_pSobelXImageLeft);
442 ImageProcessor::SobelY(m_pTempGrayImage3, m_pTempGrayImage4,
false);
443 ImageProcessor::GaussianSmooth3x3(m_pTempGrayImage4, m_pSobelYImageLeft);
449 ImageProcessor::ConvertImage(pNewCamImageRight, m_pTempGrayImage5);
450 ImageProcessor::CalculateGradientImageSobel(m_pTempGrayImage5, m_pTempGrayImage6);
451 for (
int i = 0; i < m_pTempGrayImage6->width * m_pTempGrayImage6->height; i++)
453 m_pTempGrayImage6->pixels[i] = 15 * sqrt(m_pTempGrayImage6->pixels[i]);
456#ifdef DSHT_USE_EDGE_DIRECTION
457 ImageProcessor::SobelX(m_pTempGrayImage5, m_pTempGrayImage6,
false);
458 ImageProcessor::GaussianSmooth3x3(m_pTempGrayImage6, m_pSobelXImageRight);
459 ImageProcessor::SobelY(m_pTempGrayImage5, m_pTempGrayImage6,
false);
460 ImageProcessor::GaussianSmooth3x3(m_pTempGrayImage6, m_pSobelYImageRight);
471 m_pObjectFinderLeft->PrepareImages(pNewCamImageLeft);
472 m_pObjectFinderLeft->FindObjects(pNewCamImageLeft,
476 default_trball_hue_tolerance,
477 default_trball_sat_min,
478 default_trball_sat_max,
479 default_trball_val_min,
480 default_trball_val_max,
483 int nNumRegions = m_pObjectFinderLeft->Finalize();
490 for (
int i = 0; i < nNumRegions && i < m_nMaxTrBallRegions; i++)
492 pRegion = &(m_pObjectFinderLeft->m_objectList.at(i).region);
493 m_pdTrBallPosXLeft[i] = 0.5 * (pRegion->min_x + pRegion->max_x);
494 m_pdTrBallPosYLeft[i] = 0.5 * (pRegion->min_y + pRegion->max_y);
495 m_pdTrBallRadiusLeft[i] =
496 (double)(((pRegion->max_x - pRegion->min_x) >
497 (pRegion->max_y - pRegion->min_y))
498 ? 0.5 * (pRegion->max_x - pRegion->min_x)
499 : 0.5 * (pRegion->max_y - pRegion->min_y));
505 m_pParticleFilter->SetTrackingBallPositions(m_pdTrBallPosXLeft,
507 m_pdTrBallRadiusLeft,
517 m_pObjectFinderRight->PrepareImages(pNewCamImageRight);
518 m_pObjectFinderRight->FindObjects(pNewCamImageRight,
522 default_trball_hue_tolerance,
523 default_trball_sat_min,
524 default_trball_sat_max,
525 default_trball_val_min,
526 default_trball_val_max,
529 int nNumRegions = m_pObjectFinderRight->Finalize();
532 for (
int i = 0; i < nNumRegions && i < m_nMaxTrBallRegions; i++)
534 pRegion = &(m_pObjectFinderRight->m_objectList.at(i).region);
535 m_pdTrBallPosXRight[i] = 0.5 * (pRegion->min_x + pRegion->max_x);
536 m_pdTrBallPosYRight[i] = 0.5 * (pRegion->min_y + pRegion->max_y);
537 m_pdTrBallRadiusRight[i] =
538 (double)(((pRegion->max_x - pRegion->min_x) >
539 (pRegion->max_y - pRegion->min_y))
540 ? 0.5 * (pRegion->max_x - pRegion->min_x)
541 : 0.5 * (pRegion->max_y - pRegion->min_y));
543 m_pParticleFilter->SetTrackingBallPositions(m_pdTrBallPosXRight,
545 m_pdTrBallRadiusRight,
566 if (std::isnan(m_pOldFinalConf[i]))
572 if (!m_bFirstRun && !bNan)
575 for (
int i = 0; i < 3; i++)
577 m_pPredictedConf[i] = m_pOldFinalConf[i] + m_pSensorConf[i] - m_pOldSensorConf[i];
583 m_pPredictedConf[i] = m_pOldFinalConf[i] + m_pSensorConf[i] - m_pOldSensorConf[i];
584 if (m_pPredictedConf[i] < 0)
586 m_pPredictedConf[i] += 2 *
M_PI;
588 else if (m_pPredictedConf[i] >= 2 *
M_PI)
590 m_pPredictedConf[i] -= 2 *
M_PI;
595 Math3d::SetRotationMat(mTemp1, m_pSensorConf[3], m_pSensorConf[4], m_pSensorConf[5]);
596 Math3d::SetRotationMat(
597 mTemp2, m_pOldSensorConf[3], m_pOldSensorConf[4], m_pOldSensorConf[5]);
598 Math3d::Invert(mTemp2, mTemp3);
600 mTemp1, mTemp3, mTemp4);
601 Math3d::SetRotationMat(
602 mTemp1, m_pOldFinalConf[3], m_pOldFinalConf[4], m_pOldFinalConf[5]);
603 Math3d::MulMatMat(mTemp4, mTemp1, mTemp2);
605 m_pPredictedConf[3] = vTemp1.x;
606 m_pPredictedConf[4] = vTemp1.y;
607 m_pPredictedConf[5] = vTemp1.z;
615 if ((!m_bFirstRun) && (m_nPredictionMode >= 1) && !bNan)
617 m_pParticleFilter->SetConfigOfATenthOfTheParticles(0, m_pSensorConf);
618 m_pParticleFilter->SetConfigOfATenthOfTheParticles(1, m_pSensorConf);
619 m_pParticleFilter->SetConfigOfATenthOfTheParticles(2, m_pSensorConf);
620 m_pParticleFilter->SetConfigOfATenthOfTheParticles(3, m_pSensorConf);
621 m_pParticleFilter->SetConfigOfATenthOfTheParticles(4, m_pSensorConf);
622 m_pParticleFilter->SetConfigOfATenthOfTheParticles(5, m_pPredictedConf);
623 m_pParticleFilter->SetConfigOfATenthOfTheParticles(6, m_pPredictedConf);
624 m_pParticleFilter->SetConfigOfATenthOfTheParticles(7, m_pPredictedConf);
625 m_pParticleFilter->SetConfigOfATenthOfTheParticles(8, m_pPredictedConf);
626 m_pParticleFilter->SetConfigOfATenthOfTheParticles(9, m_pPredictedConf);
630 m_pParticleFilter->SetParticleConfig(m_pSensorConf);
634 double dAnnFact = 1.0;
635 double dAnnRedFactor = 0.5;
636 if (m_nNumAnnealingRuns > 4)
639 pow(0.1, 1 / (m_nNumAnnealingRuns - 1));
641 for (
int i = 0; i < m_nNumAnnealingRuns; i++)
643 ARMARX_VERBOSE_S <<
"PF: Iteration " << i + 1 <<
" of " << m_nNumAnnealingRuns;
644 m_pParticleFilter->ParticleFilter(m_pPFConf, m_dVarianceFactor * dAnnFact);
645 dAnnFact *= dAnnRedFactor;
651 m_pParticleFilter->GetDetailedRating(m_pPFConf, &m_PFRating);
652 m_dRating = (0.5 + 0.5 * m_PFRating.dConfidenceOfRating) * m_PFRating.dRating;
662 if (m_nPredictionMode == 0 || bNan)
666 m_pFinalConf[i] = m_pPFConf[i];
669 else if (m_nPredictionMode == 1 || m_nPredictionMode == 2)
676 double dMovementRating = 1;
683 m_pFinalConf[i] = m_pPFConf[i];
690 else if (m_dRating < 0.05 &&
false)
694 m_pFinalConf[i] = m_pPredictedConf[i];
699 const float fWeightingFactor = 3.0;
700 double dWeight = (fWeightingFactor * m_dRating * dMovementRating /
701 (m_dOldRating + fWeightingFactor * m_dRating * dMovementRating));
704 for (
int i = 0; i < 3; i++)
706 m_pFinalConf[i] = dWeight * m_pPFConf[i] + (1 - dWeight) * m_pPredictedConf[i];
710 Math3d::SetRotationMat(
711 mTemp1, m_pPredictedConf[3], m_pPredictedConf[4], m_pPredictedConf[5]);
712 Math3d::SetRotationMat(mTemp2, m_pPFConf[3], m_pPFConf[4], m_pPFConf[5]);
713 Math3d::Invert(mTemp1, mTemp3);
715 mTemp2, mTemp3, mTemp4);
716 Math3d::GetAxisAndAngle(mTemp4, vTemp1, fTemp1);
718 Math3d::SetRotationMatAxis(mTemp3, vTemp1, fTemp1);
719 Math3d::MulMatMat(mTemp3, mTemp1, mTemp2);
721 m_pFinalConf[3] = vTemp1.x;
722 m_pFinalConf[4] = vTemp1.y;
723 m_pFinalConf[5] = vTemp1.z;
728 m_pFinalConf[i] = dWeight * m_pPFConf[i] + (1 - dWeight) * m_pPredictedConf[i];
733 if (m_nPredictionMode == 2)
736 m_pParticleFilter->SetParticleConfig(m_pFinalConf);
737 m_pParticleFilter->ParticleFilter(
738 (
double*)pTempConf, 0.05, m_pParticleFilter->GetNumberOfParticles() / 4);
741 m_pFinalConf[i] = 0.7 * pTempConf[i] + 0.3 * m_pFinalConf[i];
744 m_pParticleFilter->GetDetailedRating(m_pFinalConf, &m_PFRating);
745 m_dRating = (0.5 + 0.5 * m_PFRating.dConfidenceOfRating) * m_PFRating.dRating;
756 pEstimatedConfig[i] = m_pFinalConf[i];
757 m_pOldFinalConf[i] = m_pFinalConf[i];
758 m_pOldSensorConf[i] = m_pSensorConf[i];
759 m_pOldPFConf[i] = m_pPFConf[i];
761 m_dOldRating = m_dRating;
763 configMutex.unlock();