56 int nNumAnnealingRuns,
58 CStereoCalibration* pCalibration,
59 std::string sHandModelFileName)
107 m_pOldFinalConf[i] = 0;
108 m_pSensorConf[i] = 0;
109 m_pOldSensorConf[i] = 0;
112 m_pPredictedConf[i] = 0;
115 m_nNumParticles = nNumParticles;
116 m_nNumAnnealingRuns = nNumAnnealingRuns;
117 m_nPredictionMode = nPredictionMode;
118 m_dVarianceFactor = 1.0;
120 const int nNumThreads = omp_get_num_procs();
131 m_pSobelYImageRight);
133 m_pObjectFinderLeft =
new CObjectFinder();
134 m_pObjectFinderRight =
new CObjectFinder();
135 m_pdTrBallPosXLeft =
new double[m_nMaxTrBallRegions];
136 m_pdTrBallPosXRight =
new double[m_nMaxTrBallRegions];
137 m_pdTrBallPosYLeft =
new double[m_nMaxTrBallRegions];
138 m_pdTrBallPosYRight =
new double[m_nMaxTrBallRegions];
139 m_pdTrBallRadiusLeft =
new double[m_nMaxTrBallRegions];
140 m_pdTrBallRadiusRight =
new double[m_nMaxTrBallRegions];
153 delete m_pHSVImageLeft;
154 delete m_pHSVImageRight;
159 delete m_pSobelXImageLeft;
160 delete m_pSobelXImageRight;
161 delete m_pSobelYImageLeft;
162 delete m_pSobelYImageRight;
163 delete m_pTempGrayImage1;
164 delete m_pTempGrayImage2;
165 delete m_pTempGrayImage3;
166 delete m_pTempGrayImage4;
167 delete m_pTempGrayImage5;
168 delete m_pTempGrayImage6;
172 delete[] m_pFinalConf;
173 delete[] m_pOldFinalConf;
174 delete[] m_pSensorConf;
175 delete[] m_pOldSensorConf;
177 delete[] m_pOldPFConf;
178 delete[] m_pPredictedConf;
180 delete m_pParticleFilter;
182 delete m_pObjectFinderLeft;
183 delete m_pObjectFinderRight;
184 delete[] m_pdTrBallPosXLeft;
185 delete[] m_pdTrBallPosXRight;
186 delete[] m_pdTrBallPosYLeft;
187 delete[] m_pdTrBallPosYRight;
188 delete[] m_pdTrBallRadiusLeft;
189 delete[] m_pdTrBallRadiusRight;
197 angles.y = asin(mat.r3);
198 angles.x = atan2((-mat.r6), (mat.r9));
199 angles.z = atan2((-mat.r2), (mat.r1));
204 const CByteImage* pNewCamImageRight,
205 const Vec3d vPositionFromSensors,
206 const Mat3d mOrientationFromSensors,
207 const double* pSensorConfigFingers,
208 double* pEstimatedConfig,
209 double& dConfidenceRating)
212 Vec3d vRotationAngles;
214 pSensorConfig[0] = vPositionFromSensors.x;
215 pSensorConfig[1] = vPositionFromSensors.y;
216 pSensorConfig[2] = vPositionFromSensors.z;
217 pSensorConfig[3] = vRotationAngles.x;
218 pSensorConfig[4] = vRotationAngles.y;
219 pSensorConfig[5] = vRotationAngles.z;
222 pSensorConfig[i] = pSensorConfigFingers[i - 6];
239 handPose(0, 3) = m_pFinalConf[0];
240 handPose(1, 3) = m_pFinalConf[1];
241 handPose(2, 3) = m_pFinalConf[2];
244 Math3d::SetRotationMat(orientation, m_pFinalConf[3], m_pFinalConf[4], m_pFinalConf[5]);
246 configMutex.unlock();
248 handPose(0, 0) = orientation.r1;
249 handPose(0, 1) = orientation.r2;
250 handPose(0, 2) = orientation.r3;
251 handPose(1, 0) = orientation.r4;
252 handPose(1, 1) = orientation.r5;
253 handPose(1, 2) = orientation.r6;
254 handPose(2, 0) = orientation.r7;
255 handPose(2, 1) = orientation.r8;
256 handPose(2, 2) = orientation.r9;
271 configMutex.unlock();
273 std::vector<Vec3d>
ret;
276 Vec3d vAverage = {0, 0, 0};
281 Math3d::AddToVec(vAverage,
284 Math3d::MulVecScalar(vAverage,
288 ret.push_back(vAverage);
300 ret[i] = m_pFinalConf[i];
302 configMutex.unlock();
308 const Mat3d mOrientation,
309 const double* pConfigFingers)
312 Vec3d vRotationAngles;
314 m_pFinalConf[0] = vPosition.x;
315 m_pFinalConf[1] = vPosition.y;
316 m_pFinalConf[2] = vPosition.z;
317 m_pFinalConf[3] = vRotationAngles.x;
318 m_pFinalConf[4] = vRotationAngles.y;
319 m_pFinalConf[5] = vRotationAngles.z;
322 m_pFinalConf[i] = pConfigFingers[i - 6];
324 configMutex.unlock();
334 ret[i] = m_pSensorConf[i];
336 configMutex.unlock();
342 const Mat3d mOrientation,
343 const double* pConfigFingers)
346 Vec3d vRotationAngles;
348 m_pSensorConf[0] = vPosition.x;
349 m_pSensorConf[1] = vPosition.y;
350 m_pSensorConf[2] = vPosition.z;
351 m_pSensorConf[3] = vRotationAngles.x;
352 m_pSensorConf[4] = vRotationAngles.y;
353 m_pSensorConf[5] = vRotationAngles.z;
356 m_pSensorConf[i] = pConfigFingers[i - 6];
358 configMutex.unlock();
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();
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);
444 #endif // DSHT_USE_EDGE_DIRECTION
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);
461 #endif // DSHT_USE_EDGE_DIRECTION
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));
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));
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)
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;
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)
741 m_pFinalConf[i] = 0.7 * pTempConf[i] + 0.3 * m_pFinalConf[i];
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();