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++)
393 for (
int i = 0; i < num_polygons; 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++)
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;
454 polygon_interior_sum,
455 polygon_interior_size,
457 region_sum -= polygon_interior_sum;
458 region_length -= polygon_interior_size;
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;
501 #endif // DSHT_USE_EDGE_DIRECTION
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);
524 #endif // DSHT_USE_EDGE_DIRECTION
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));
601 #endif // DSHT_USE_EDGE_DIRECTION (else)
614 const int num_polygons = 5;
619 for (
int i = 0; i < num_polygons; i++)
626 for (
int i = 0; i < num_polygons; 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;
677 dMinDistance = 1000000000;
684 if (dTempDist < dMinDistance)
686 dMinDistance = dTempDist;
697 if (std::isnan(dDistanceZ))
699 dDistanceZ = FLT_MAX;
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) +
776 #endif // DSHT_USE_EDGE_DIRECTION
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 *
850 #endif // DSHT_USE_EDGE_DIRECTION
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
980 #endif // DSHT_USE_EDGE_DIRECTION
987 if (
m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(1).center3d.z <
1000 else if (
m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(0).center3d.z <
1017 if (
m_pHandModels[0]->m_aFingerTipPolygonsLeftCam.at(0).center3d.z <
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);