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));