38 int nNumParallelThreads,
39 CStereoCalibration* pCalibration,
40 std::string sHandModelFileName) :
125 CByteImage* pRegionImageRight,
126 CByteImage* pSobelImageLeft,
127 CByteImage* pSobelImageRight,
128 CByteImage* pSobelXImageLeft,
129 CByteImage* pSobelXImageRight,
130 CByteImage* pSobelYImageLeft,
131 CByteImage* pSobelYImageRight)
148 for (
int i = 0; i < m_nParticles; i++)
149 for (
int j = 0; j < m_nDimension; j++)
151 s[i][j] = pConfig[j];
159 for (
int i = 0; i < m_nParticles / 2; i++)
160 for (
int j = 0; j < m_nDimension; j++)
162 s[i][j] = pConfig[j];
171 if (nTenthIndex >= 0 && nTenthIndex <= 9)
173 for (
int i = m_nParticles / 10 * nTenthIndex; i < m_nParticles / 10 * (nTenthIndex + 1);
175 for (
int j = 0; j < m_nDimension; j++)
177 s[i][j] = pConfig[j];
186 for (
int i = 0; i < m_nDimension; i++)
198 for (
int i = 0; i < m_nDimension; i++)
210 int nNumTrBallRegions,
249#pragma omp parallel for
250 for (
int nNewIndex = 0; nNewIndex < m_nParticles; nNewIndex++)
252 int nOldIndex = PickBaseSample();
254 for (
int i = 0; i < m_nDimension; i++)
256 double dNewValue = s[nOldIndex][i] + dSigmaFactor * sigma[i] * gaussian_random();
257 s_temp[nNewIndex][i] =
258 (dNewValue >= lower_limit[i] && dNewValue <= upper_limit[i])
260 : (0.7 * 0.5 * (lower_limit[i] + upper_limit[i]) + 0.3 * s[nOldIndex][i] +
261 0.5 * dSigmaFactor * sigma[i] * gaussian_random());
266 double** temp = s_temp;
285 const int width = pImage->width;
287 int leftBorderInt, rightBorderInt, up, down, indexLeft, indexRight, indexMain, nTempOffset;
288 float leftBorder = 0, rightBorder = 0, leftOffset = 0, rightOffset = 0;
295 for (indexMain = 0; indexMain < pol->
nCorners - 1; indexMain++)
297 if (pol->
hull[indexMain].z != 2)
300 leftBorder = pol->
hullLeft[indexLeft].x;
301 leftOffset = (pol->
hullLeft[indexLeft + 1].x - pol->
hullLeft[indexLeft].x) /
305 if (pol->
hull[indexMain].z != 1)
308 rightBorder = pol->
hullRight[indexRight].x;
313 up = (int)pol->
hull[indexMain].y;
314 down = (int)pol->
hull[indexMain + 1].y;
316 if (pol->
hull[indexMain + 1].z != 2)
320 if (pol->
hull[indexMain + 1].z != 1)
340 for (
int j = up; j > down; j--, leftBorder -= leftOffset, rightBorder -= rightOffset)
343 leftBorderInt = (int)leftBorder;
344 rightBorderInt = (int)rightBorder;
352 if (leftBorderInt < 0)
361 nTempOffset = j * width;
363 for (
int k = leftBorderInt; k < rightBorderInt; k++)
365 region_sum += pImage->pixels[nTempOffset + k];
381 const int num_polygons = 5;
386 for (
int i = 0; i < num_polygons; i++)
388 polygons[i] = &
m_pHandModels[nModelIndex]->m_aFingerTipPolygonsLeftCam.at(i);
393 for (
int i = 0; i < num_polygons; i++)
395 polygons[i] = &
m_pHandModels[nModelIndex]->m_aFingerTipPolygonsRightCam.at(i);
402 int polygon_interior_sum, polygon_interior_size;
407 for (
int i = 0; i < num_polygons; i++)
410 polygons[i], polygon_interior_sum, polygon_interior_size, bLeftCamImage);
411 region_sum += polygon_interior_sum;
412 region_length += polygon_interior_size;
418 for (
int i = 1; i < num_polygons; i++)
420 if (PolygonsMightIntersect(polygons[0], polygons[i]))
431 polygon_interior_sum,
432 polygon_interior_size,
434 region_sum -= polygon_interior_sum;
435 region_length -= polygon_interior_size;
439 for (
int i = 1; i < num_polygons - 1;
443 if (PolygonsMightIntersect(polygons[i], polygons[i + 1]))
454 polygon_interior_sum,
455 polygon_interior_size,
457 region_sum -= polygon_interior_sum;
458 region_length -= polygon_interior_size;
463 if (PolygonsMightIntersect(polygons[1], polygons[3]))
474 polygon_interior_sum,
475 polygon_interior_size,
477 region_sum -= polygon_interior_sum;
478 region_length -= polygon_interior_size;
495 int up, down, left, right, lineSum;
496 double xOffset, xDiff, yOffset, yDiff, lineLength;
498#ifdef DSHT_USE_EDGE_DIRECTION
500 double angleSum, normalX, normalY;
508 const int width = pImage->width;
510 for (
int i = 0; i < nPoints - 1; i++)
515 (linePoints[i + 1].
x - linePoints[i].
x) * (linePoints[i + 1].
x - linePoints[i].
x) +
516 (linePoints[i + 1].y - linePoints[i].y) * (linePoints[i + 1].y - linePoints[i].y));
518#ifdef DSHT_USE_EDGE_DIRECTION
520 normalX = (linePoints[i + 1].y -
523 -(linePoints[i + 1].x - linePoints[i].x);
526 if (linePoints[i].y > linePoints[i + 1].y)
528 up = (int)linePoints[i].y;
529 down = (int)linePoints[i + 1].y;
530 xOffset = linePoints[i + 1].x;
534 up = (int)linePoints[i + 1].y;
535 down = (int)linePoints[i].y;
536 xOffset = linePoints[i].x;
539 if (linePoints[i].
x > linePoints[i + 1].
x)
541 right = (int)linePoints[i].
x;
542 left = (int)linePoints[i + 1].
x;
543 yOffset = linePoints[i + 1].y;
547 right = (int)linePoints[i + 1].
x;
548 left = (int)linePoints[i].
x;
549 yOffset = linePoints[i].y;
552 if (up < DSHT_IMAGE_HEIGHT && down >= 0 && left >= 0 && right <
DSHT_IMAGE_WIDTH)
554 xDiff = (linePoints[i + 1].x - linePoints[i].x) /
555 (linePoints[i + 1].y - linePoints[i].y);
556 yDiff = (linePoints[i + 1].y - linePoints[i].y) /
557 (linePoints[i + 1].
x - linePoints[i].
x);
559#ifdef DSHT_USE_EDGE_DIRECTION
560 for (
int j = down; j < up; j++, xOffset += xDiff)
562 absVal = pImage->pixels[j * width + (int)xOffset];
564 angleSum += abs(((
double)pImage->pixels[j * width + (
int)xOffset] * normalX +
565 (
double)pImage->pixels[j * width + (
int)xOffset] * normalY) /
566 ((
double)absVal + 0.001));
570 for (
int j = left; j < right; j++, yOffset += yDiff)
572 absVal = pImage->pixels[((int)yOffset) * width + j];
574 angleSum += abs(((
double)pImage->pixels[((
int)yOffset) * width + j] * normalX +
575 (
double)pImage->pixels[((
int)yOffset) * width + j] * normalY) /
576 ((
double)absVal + 0.001));
579 edge_length += (int)lineLength;
581 edge_sum += (int)((
double)lineSum * lineLength /
582 ((
double)(up - down + right - left) + 0.001));
583 angle_diffs += angleSum / ((double)(up - down + right - left) +
587 for (
int j = down; j < up; j++, xOffset += xDiff)
589 lineSum += pImage->pixels[j * width + (int)xOffset];
592 for (
int j = left; j < right; j++, yOffset += yDiff)
594 lineSum += pImage->pixels[((int)yOffset) * width + j];
597 edge_length += (int)lineLength;
599 edge_sum += (int)((
double)lineSum * lineLength /
600 ((
double)(up - down + right - left) + 0.001));
614 const int num_polygons = 5;
619 for (
int i = 0; i < num_polygons; i++)
621 polygons[i] = &
m_pHandModels[nModelIndex]->m_aFingerTipPolygonsLeftCam.at(i);
626 for (
int i = 0; i < num_polygons; i++)
628 polygons[i] = &
m_pHandModels[nModelIndex]->m_aFingerTipPolygonsRightCam.at(i);
632 int temp_edge_sum, temp_edge_length;
633 double temp_angle_diffs;
638 for (
int i = 0; i < num_polygons; i++)
641 polygons[i]->nCorners + 1,
646 edge_sum += temp_edge_sum;
647 edge_length += temp_edge_length;
648 angle_diffs += temp_angle_diffs;
663 double dPosX, dPosY, dRadius;
672 dPosX =
m_pHandModels[nModelIndex]->m_vTrackingBallPosLeftCam.x;
673 dPosY =
m_pHandModels[nModelIndex]->m_vTrackingBallPosLeftCam.y;
674 dRadius =
m_pHandModels[nModelIndex]->m_fTrackingBallRadiusLeftCam;
677 dMinDistance = 1000000000;
684 if (dTempDist < dMinDistance)
686 dMinDistance = dTempDist;
697 if (std::isnan(dDistanceZ))
699 dDistanceZ = FLT_MAX;
705 dPosX =
m_pHandModels[nModelIndex]->m_vTrackingBallPosRightCam.x;
706 dPosY =
m_pHandModels[nModelIndex]->m_vTrackingBallPosRightCam.y;
707 dRadius =
m_pHandModels[nModelIndex]->m_fTrackingBallRadiusRightCam;
710 dMinDistance = 1000000000;
717 if (dTempDist < dMinDistance)
719 dMinDistance = dTempDist;
742 int nRegionSumLeftImg, nRegionLengthLeftImg, nEdgeSumLeftImg, nEdgeLengthLeftImg;
743 int nRegionSumRightImg, nRegionLengthRightImg, nEdgeSumRightImg, nEdgeLengthRightImg;
744 double fAngleDiffsLeftImg, fAngleDiffsRightImg;
752 nEdgeSumLeftImg, nEdgeLengthLeftImg, fAngleDiffsLeftImg, nModelIndex,
true);
754 nEdgeSumRightImg, nEdgeLengthRightImg, fAngleDiffsRightImg, nModelIndex,
false);
756 double dTrBallDistXY, dTrBallDistZ;
761 m_ppProbabilities[0][nParticleIndex] = 0.5 * (nRegionSumLeftImg + nRegionSumRightImg);
763 (double)(nRegionSumLeftImg + nRegionSumRightImg) /
764 ((double)(nRegionLengthLeftImg + nRegionLengthRightImg) + 0.001);
766 m_ppProbabilities[2][nParticleIndex] = 0.5 * (nEdgeSumLeftImg + nEdgeSumRightImg);
768 (double)(nEdgeSumLeftImg + nEdgeSumRightImg) /
769 ((double)(nEdgeLengthLeftImg + nEdgeLengthRightImg) + 0.001);
770#ifdef DSHT_USE_EDGE_DIRECTION
771 m_ppProbabilities[4][nParticleIndex] = -(fAngleDiffsLeftImg + fAngleDiffsRightImg) /
772 ((
double)(nEdgeLengthLeftImg + nEdgeLengthRightImg) +
781 return (
double)(nRegionSumLeftImg / 255) +
782 ((
double)nRegionSumLeftImg / ((
double)(nRegionLengthLeftImg * 255) + 0.001));
795 double min = 99999999;
796 double max = -99999999;
798 for (
int j = 0; j < m_nParticles; j++)
818 for (
int j = 0; j < m_nParticles; j++)
833#pragma omp parallel for
834 for (
int j = 0; j < m_nParticles; j++)
836#ifdef DSHT_USE_EDGE_DIRECTION
837 pi[j] = exp(15.0 / 31.0 *
844 pi[j] = exp(15.0 / 31.0 *
874 printf(
"pi[i] is nan! m_ppProbabilities[0][j] = %f, m_ppProbabilities[1][j] = "
875 "%f, m_ppProbabilities[2][j] = %f, m_ppProbabilities[3][j] = %f, "
876 "m_ppProbabilities[4][j] = %f, m_ppProbabilities[5][j] = %f, "
877 "m_ppProbabilities[6][j] = %f\n",
901 for (i = 0; i < m_nDimension; i++)
915 std::vector<double> temp(m_nDimension);
916 for (i = 0; i < m_nDimension; i++)
924 for (i = 0; i < m_nDimension; i++)
931 int nRegionLength = 0;
935 (double)nRegionSum / ((
double)(nRegionLength * 255) + 0.001);
947 (double)nRegionSum / ((
double)(nRegionLength * 255) + 0.001);
953 double dAngleDiffs = 0;
956 pRating->
dEdgePercentage = (double)nRegionSum / ((
double)nRegionLength + 0.001);
957 pRating->
dEdgeDirection = dAngleDiffs / ((double)nRegionLength + 0.001);
969#ifdef DSHT_USE_EDGE_DIRECTION
987 if (
m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(1).center3d.z <
988 m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(4).center3d.z)
991 if (abs(
m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(0).center3d.z -
992 m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(1).center3d.z) <= 30)
1000 else if (
m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(0).center3d.z <
1001 m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(1).center3d.z + 30)
1017 if (
m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(0).center3d.z <
1018 m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(4).center3d.z + 30)
1053 for (
int i = 0; i < 6; i++)
1055 result += (pNewConf[i] - pOldConf[i]) * (pNewConf[i] - pOldConf[i]) /
1058 for (
int i = 6; i < m_nDimension; i++)
1060 result += 0.1 * (pNewConf[i] - pOldConf[i]) * (pNewConf[i] - pOldConf[i]) /
1063 return sqrt(result);
#define DSHT_IMAGE_HEIGHT
#define DSHT_MAX_POLYGON_CORNERS
int m_nNumParallelThreads
CParticleFilterFrameworkParallelized(int nParticles, int nDimension, int nNumParallelThreads=1)
void SetImages(CByteImage *pRegionImageLeft, CByteImage *pRegionImageRight, CByteImage *pSobelImageLeft, CByteImage *pSobelImageRight, CByteImage *pSobelXImageLeft, CByteImage *pSobelXImageRight, CByteImage *pSobelYImageLeft, CByteImage *pSobelYImageRight)
int m_nNumTrackingBallRegionsLeft
CByteImage * m_pSobelXImageRight
CByteImage * m_pRegionImageLeft
double ** m_ppProbabilities
double * m_pdTrackingBallRadiusRight
void SetConfigOfATenthOfTheParticles(int nTenthIndex, double *pConfig)
double m_pProbMax[NUMBER_OF_CUES]
CByteImage * m_pSobelYImageRight
void CalculatePixelSumInPolygon(ConvexPolygonCalculations::Polygon *pol, int ®ion_sum, int ®ion_length, bool bLeftCamImage)
double CalculateProbability(int nParticleIndex, int nModelIndex) override
virtual ~CParticleFilterRobotHandLocalisation()
CByteImage * m_pSobelImageRight
CHandModelV2 ** m_pHandModels
double DistanceBetweenConfigs(double *pOldConf, double *pNewConf)
CParticleFilterRobotHandLocalisation(int nParticles, int nDimension, int nNumParallelThreads, CStereoCalibration *pCalibration, std::string sHandModelFileName)
ConvexPolygonCalculations::Polygon ** m_pTempIntersectionPolygons
void SetTrackingBallPositions(double *dPosX, double *dPosY, double *dRadius, int nNumTrBallRegions, bool bLeftCamImage)
int m_nNumTrackingBallRegionsRight
double * m_pdTrackingBallPosYLeft
double m_pProbMin[NUMBER_OF_CUES]
Vec3d ** m_pTempVecArrays
void CalculateTrackingBallCue(double &dDistanceXY, double &dDistanceZ, int nModelIndex)
void PredictNewBases(double dSigmaFactor) override
void CalculateRegionCue(int ®ion_sum, int ®ion_length, int nModelIndex, bool bLeftCamImage)
bool ** m_pTempBoolArrays
void CalculateFinalProbabilities() override
Vec3d ** m_pTempClockwiseHullPolys2
void CalculatePixelSumOnLineSequence(Vec3d linePoints[], int nPoints, int &edge_sum, int &edge_length, double &angle_diffs, bool bLeftCamImage)
double * allowed_deviation
void SetParticleConfigHalf(double *pConfig)
void SetSensorConfig(double *sconfig)
double * m_pdTrackingBallRadiusLeft
double * m_pdTrackingBallPosXLeft
void UpdateModel(int nParticleIndex, int nModelIndex) override
Vec3d ** m_pTempClockwiseHullPolys1
double * m_pdTrackingBallPosYRight
void SetParticleConfig(double *pConfig)
void SetAllowedDeviation(double *adeviation)
CByteImage * m_pSobelImageLeft
double * m_pdTrackingBallPosXRight
void GetDetailedRating(double *pConf, DetailedPFRating *pRating)
CByteImage * m_pSobelYImageLeft
CByteImage * m_pRegionImageRight
CByteImage * m_pSobelXImageLeft
void CalculateEdgeCue(int &edge_sum, int &edge_length, double &angle_diffs, int nModelIndex, bool bLeftCamImage)
This file offers overloads of toIce() and fromIce() functions for STL container types.
void GetPolygonIntersection(Polygon *p1, Polygon *p2, Polygon *pInter, Vec3d *pointAccu, bool *boolTable, Vec3d *clockwiseHullPoly1, Vec3d *clockwiseHullPoly2)
const double DSHT_default_allowed_deviation[12]
Vec3d hull[2 *DSHT_MAX_POLYGON_CORNERS]
Vec3d hullLeft[2 *DSHT_MAX_POLYGON_CORNERS+1]
Vec3d hullRight[2 *DSHT_MAX_POLYGON_CORNERS+1]
double dOverallFoundPercentageOfExpectedPixels
double dConfidenceOfRating
int nOverallNumberOfFoundPixels
int nNumberOfWhitePixelsInImage
int nNumberOfFoundPixelsOfFinger[DSHT_NUM_FINGERS]
double dResultConfig[DSHT_NUM_PARAMETERS]
double dFoundPercentageOfExpectedPixelsOfFinger[DSHT_NUM_FINGERS]