28 #include <Image/ImageProcessor.h> 
   50                 pCalibration->GetLeftCalibration()->GetCameraParameters().focalLength.x;
 
   52                 pCalibration->GetLeftCalibration()->GetCameraParameters().focalLength.y;
 
   54                 pCalibration->GetLeftCalibration()->GetCameraParameters().principalPoint.x;
 
   56                 pCalibration->GetLeftCalibration()->GetCameraParameters().principalPoint.y;
 
   61                 pCalibration->GetRightCalibration()->GetCameraParameters().focalLength.x;
 
   63                 pCalibration->GetRightCalibration()->GetCameraParameters().focalLength.y;
 
   65                 pCalibration->GetRightCalibration()->GetCameraParameters().principalPoint.x;
 
   67                 pCalibration->GetRightCalibration()->GetCameraParameters().principalPoint.y;
 
   76                 << 
"CHandModelVisualizer constructor: Could not load OpenInventor-file from " 
   95                                           bool bUpdateOpenInventorModel,
 
   96                                           bool bDrawCylinderInHand)
 
  102         if (bUpdateOpenInventorModel)
 
  187         if (bDrawCylinderInHand)
 
  189             printf(
"Warning: CHandModelVisualizer::ConfigureMoveMasterModel: Cylinder not " 
  190                    "available with new HandmodelV2. Code needs to be changed.\n");
 
  193         Vec3d vCylinderCenter = {0, 0, -1000};
 
  200         vConfPos.x = pConfig[0];
 
  201         vConfPos.y = pConfig[1];
 
  202         vConfPos.z = pConfig[2];
 
  206         Mat3d m0, m1, m2, m3;
 
  208         Math3d::SetRotationMat(m0, pConfig[3], pConfig[4], pConfig[5]);
 
  209         Math3d::SetRotationMatX(m1, -
M_PI / 2);
 
  210         Math3d::SetRotationMatZ(m2, 
M_PI / 2);
 
  211         Math3d::MulMatMat(m1, m2, m3);
 
  212         Math3d::MulMatMat(m0, m3, m1);
 
  251         const int width = pImage->width;
 
  252         int leftBorderInt, rightBorderInt, 
up, 
down, indexLeft, indexRight, indexMain, nTempOffset;
 
  253         float leftBorder = 0, rightBorder = 0, leftOffset = 0, rightOffset = 0;
 
  257         for (indexMain = 0; indexMain < pPolygon.
nCorners - 1; indexMain++)
 
  259             if (pPolygon.
hull[indexMain].z != 2)
 
  261                 leftBorder = pPolygon.
hullLeft[indexLeft].x;
 
  262                 leftOffset = (pPolygon.
hullLeft[indexLeft + 1].x - pPolygon.
hullLeft[indexLeft].x) /
 
  265             if (pPolygon.
hull[indexMain].z != 1)
 
  267                 rightBorder = pPolygon.
hullRight[indexRight].x;
 
  272             up = (int)pPolygon.
hull[indexMain].y;
 
  273             down = (
int)pPolygon.
hull[indexMain + 1].y;
 
  275             if (pPolygon.
hull[indexMain + 1].z != 2)
 
  279             if (pPolygon.
hull[indexMain + 1].z != 1)
 
  299             for (
int j = 
up; j > 
down; j--, leftBorder -= leftOffset, rightBorder -= rightOffset)
 
  302                 leftBorderInt = (int)leftBorder;
 
  303                 rightBorderInt = (int)rightBorder;
 
  311                 if (leftBorderInt < 0)
 
  320                 nTempOffset = j * width;
 
  321                 for (
int k = leftBorderInt; k < rightBorderInt; k++)
 
  323                     pImage->pixels[3 * (nTempOffset + k) + 0] = 0;
 
  324                     pImage->pixels[3 * (nTempOffset + k) + 1] = 0;
 
  325                     pImage->pixels[3 * (nTempOffset + k) + 2] = 255;
 
  337         const int width = pImage->width;
 
  338         int leftBorderInt, rightBorderInt, 
up, 
down, indexLeft, indexRight, indexMain, nTempOffset;
 
  339         float leftBorder = 0, rightBorder = 0, leftOffset = 0, rightOffset = 0;
 
  343         for (indexMain = 0; indexMain < pPolygon.
nCorners - 1; indexMain++)
 
  345             if (pPolygon.
hull[indexMain].z != 2)
 
  347                 leftBorder = pPolygon.
hullLeft[indexLeft].x;
 
  348                 leftOffset = (pPolygon.
hullLeft[indexLeft + 1].x - pPolygon.
hullLeft[indexLeft].x) /
 
  351             if (pPolygon.
hull[indexMain].z != 1)
 
  353                 rightBorder = pPolygon.
hullRight[indexRight].x;
 
  358             up = (int)pPolygon.
hull[indexMain].y;
 
  359             down = (
int)pPolygon.
hull[indexMain + 1].y;
 
  361             if (pPolygon.
hull[indexMain + 1].z != 2)
 
  365             if (pPolygon.
hull[indexMain + 1].z != 1)
 
  385             for (
int j = 
up; j > 
down; j--, leftBorder -= leftOffset, rightBorder -= rightOffset)
 
  388                 leftBorderInt = (int)leftBorder;
 
  389                 rightBorderInt = (int)rightBorder;
 
  397                 if (leftBorderInt < 0)
 
  406                 nTempOffset = j * width;
 
  407                 for (
int k = leftBorderInt; k < rightBorderInt; k++)
 
  409                     pImage->pixels[nTempOffset + k] = 255;
 
  499         const CCalibration* pCalibration = bLeftCameraImage
 
  504         if (bLeftCameraImage)
 
  506             for (
int i = 0; i < 5; i++)
 
  513             for (
int i = 0; i < 5; i++)
 
  522         Vec2d vProjectedPoint1, vProjectedPoint2;
 
  524         pCalibration->WorldToImageCoordinates(
 
  528         for (
int i = 0; i < 5; i++)
 
  530             pCalibration->WorldToImageCoordinates(
 
  543         for (
int i = 0; i < 5; i++)
 
  545             pCalibration->WorldToImageCoordinates(
 
  549                 pCalibration->WorldToImageCoordinates(
 
  559                 Math2d::SetVec(vProjectedPoint1, vProjectedPoint2);
 
  565         double dCenterX, dCenterY, dRadius;
 
  566         if (bLeftCameraImage)
 
  579         int up = (int)(dCenterY - dRadius);
 
  580         int down = (int)(dCenterY + dRadius);
 
  581         for (
int i = 
up; i <= 
down; i++)
 
  584                 (int)(dCenterX - 
sqrt(dRadius * dRadius - (i - dCenterY) * (i - dCenterY)));
 
  586                 (int)(dCenterX + 
sqrt(dRadius * dRadius - (i - dCenterY) * (i - dCenterY)));
 
  587             for (
int j = leftBorderInt; j <= rightBorderInt; j++)
 
  604         unsigned char* pRenderedImage =
 
  606         int tempIndex, tempIndexX, tempIndexY;
 
  616         for (
int i = 0; i < renderSizeY; i++)
 
  618             for (
int j = 0; j < renderSizeX; j++)
 
  621                 if (pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j)] < 255 ||
 
  622                     pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) + 1] > 0 ||
 
  623                     pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) + 2] > 0)
 
  625                     tempIndexX = j - (renderSizeX / 2) + principal_point_x;
 
  626                     tempIndexY = i - (renderSizeY / 2) + principal_point_y;
 
  634                             pImage->pixels[tempIndex + 0] =
 
  636                                     pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) + 0] +
 
  637                                 0.6 * pImage->pixels[tempIndex + 0];
 
  638                             pImage->pixels[tempIndex + 1] =
 
  640                                     pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) + 1] +
 
  641                                 0.6 * pImage->pixels[tempIndex + 1];
 
  642                             pImage->pixels[tempIndex + 2] =
 
  644                                     pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) + 2] +
 
  645                                 0.6 * pImage->pixels[tempIndex + 2];
 
  656         if (!bUseOpenInventorModel)
 
  662             unsigned char* pRenderedImage =
 
  673                 ::ImageProcessor::Zero(pImage);
 
  677                 int tempIndex, tempIndexX, tempIndexY;
 
  681                 for (
int i = 0; i < renderSizeY; i++)
 
  683                     for (
int j = 0; j < renderSizeX; j++)
 
  686                         if (pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j)] < 250 ||
 
  687                             pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) + 1] > 10 ||
 
  688                             pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) + 2] > 10)
 
  690                             tempIndexX = j - (renderSizeX / 2) + principal_point_x;
 
  691                             tempIndexY = i - (renderSizeY / 2) + principal_point_y;
 
  697                                 if (tempIndex >= 0 &&
 
  701                                     if (pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j)] >
 
  703                                         pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) +
 
  705                                         pRenderedImage[3 * (renderSizeX * (renderSizeY - i) + j) +
 
  708                                         pImage->pixels[tempIndex] = 42;
 
  711                                     else if (pRenderedImage[3 * (renderSizeX * (renderSizeY - i) +
 
  713                                              pRenderedImage[3 * (renderSizeX * (renderSizeY - i) +
 
  716                                              pRenderedImage[3 * (renderSizeX * (renderSizeY - i) +
 
  720                                         pImage->pixels[tempIndex] = 128;
 
  725                                         pImage->pixels[tempIndex] = 255;
 
  733                 if (pImage->type == CByteImage::eRGB24)
 
  737                         pImage->pixels[3 * i] = pImage->pixels[i];
 
  741                         pImage->pixels[3 * i + 1] = pImage->pixels[3 * i];
 
  742                         pImage->pixels[3 * i + 2] = pImage->pixels[3 * i];
 
  753         if (pSegmentedImage->type == CByteImage::eRGB24)
 
  755             pImage = 
new CByteImage(
 
  756                 pSegmentedImage->width, pSegmentedImage->height, CByteImage::eGrayScale);
 
  760             pImage = pSegmentedImage;
 
  762         ::ImageProcessor::Zero(pImage);
 
  765         for (
int i = 0; i < 5; i++)
 
  770         const float fFingerWidth = 25.0f;
 
  773         for (
int i = 0; i < 5; i++)
 
  783         for (
int i = 0; i < 5; i++)
 
  796         double dCenterX, dCenterY, dRadius;
 
  801         int up = (int)(dCenterY - dRadius);
 
  802         int down = (int)(dCenterY + dRadius);
 
  803         for (
int i = 
up; i <= 
down; i++)
 
  806                 (int)(dCenterX - 
sqrt(dRadius * dRadius - (i - dCenterY) * (i - dCenterY)));
 
  808                 (int)(dCenterX + 
sqrt(dRadius * dRadius - (i - dCenterY) * (i - dCenterY)));
 
  809             for (
int j = leftBorderInt; j <= rightBorderInt; j++)
 
  819         Vec3d vArmLength = {0, 0, -500};
 
  827         CByteImage* pTempImage = 
new CByteImage(pImage);
 
  831         ::ImageProcessor::Dilate(pImage, pTempImage, 14);
 
  832         ::ImageProcessor::Dilate(pTempImage, pImage, 14);
 
  839         if (pSegmentedImage->type == CByteImage::eRGB24)
 
  841             for (
int i = 0; i < pSegmentedImage->width * pSegmentedImage->height; i++)
 
  843                 pSegmentedImage->pixels[3 * i + 0] = pImage->pixels[i];
 
  844                 pSegmentedImage->pixels[3 * i + 1] = pImage->pixels[i];
 
  845                 pSegmentedImage->pixels[3 * i + 2] = pImage->pixels[i];
 
  855             for (
int j = -3; j <= 3; j++)
 
  868             for (
int j = -3; j <= 3; j++)
 
  891         if (x1 < 0 || x1 >= pImage->width || x2 < 0 || x2 >= pImage->width || y1 < 0 ||
 
  892             y1 >= pImage->height || y2 < 0 || y2 >= pImage->height)
 
  897         if (x1 == x2 && y1 == y2)
 
  899             pImage->pixels[3 * (y1 * pImage->width + x1)] = 
red;
 
  900             pImage->pixels[3 * (y1 * pImage->width + x1) + 1] = 
green;
 
  901             pImage->pixels[3 * (y1 * pImage->width + x1) + 2] = blue;
 
  917             float divided_diff = (
float)(y2 - y1) / (
float)(x2 - x1);
 
  919             for (
int i = x1; i < x2; i++)
 
  921                 pImage->pixels[3 * (((int)((i - x1) * divided_diff) + y1) * pImage->width + i)] =
 
  924                     ->pixels[3 * (((int)((i - x1) * divided_diff) + y1) * pImage->width + i) + 1] =
 
  927                     ->pixels[3 * (((int)((i - x1) * divided_diff) + y1) * pImage->width + i) + 2] =
 
  943             divided_diff = (
float)(x2 - x1) / (
float)(y2 - y1);
 
  945             for (
int i = y1; i < y2; i++)
 
  947                 pImage->pixels[3 * (i * pImage->width + x1 + (int)((i - y1) * divided_diff))] = 
red;
 
  948                 pImage->pixels[3 * (i * pImage->width + x1 + (int)((i - y1) * divided_diff)) + 1] =
 
  950                 pImage->pixels[3 * (i * pImage->width + x1 + (int)((i - y1) * divided_diff)) + 2] =
 
  964         Math3d::SubtractVecVec(vEnd, vStart, vDirection);
 
  965         Vec3d vOrthogonalXY = {-vDirection.y, vDirection.x, 0};
 
  966         if (Math3d::Length(vOrthogonalXY) == 0)
 
  970         Math3d::NormalizeVec(vOrthogonalXY);
 
  971         Vec3d vOrthogonalStart, vOrthogonalEnd;
 
  972         Math3d::MulVecScalar(vOrthogonalXY, 0.5f * fWidthAtStart, vOrthogonalStart);
 
  973         Math3d::MulVecScalar(vOrthogonalXY, 0.5f * fWidthAtEnd, vOrthogonalEnd);
 
  975         Vec3d p1, p2, p3, p4;
 
  976         Math3d::AddVecVec(vStart, vOrthogonalStart, p1);
 
  977         Math3d::SubtractVecVec(vStart, vOrthogonalStart, p2);
 
  978         Math3d::AddVecVec(vEnd, vOrthogonalEnd, p3);
 
  979         Math3d::SubtractVecVec(vEnd, vOrthogonalEnd, p4);
 
  981         Vec2d vProjPoint1, vProjPoint2, vProjPoint3, vProjPoint4;
 
  988             pIntersectingPolygon;
 
  990         pPoints[0].x = vProjPoint1.x;
 
  991         pPoints[0].y = vProjPoint1.y;
 
  992         pPoints[1].x = vProjPoint2.x;
 
  993         pPoints[1].y = vProjPoint2.y;
 
  994         pPoints[2].x = vProjPoint3.x;
 
  995         pPoints[2].y = vProjPoint3.y;
 
  996         pPoints[3].x = vProjPoint4.x;
 
  997         pPoints[3].y = vProjPoint4.y;
 
  999             pPoints, 4, &pProjectedQuadrangle);
 
 1012             &pProjectedQuadrangle, &pImageCorners, &pIntersectingPolygon);
 
 1014         if (pImage->type == CByteImage::eGrayScale)
 
 1027         angles.y = asin(mat.r3);
 
 1028         angles.x = atan2((-mat.r6), (mat.r9));
 
 1029         angles.z = atan2((-mat.r2), (mat.r1));