Расчет позы и трансформации для контуров и ограничивающего прямоугольника для приложения AR - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь преобразовать пример HandPoseEsvaluation в AR. Поэтому при обнаружении контура объект AR будет следовать за контуром. Мои значения преобразования не кажутся точными, поэтому я думаю, что делаю что-то не так. Вот как выглядит моя отладка для значений преобразования:

transformationM  1.00000 0.00000 0.00000 0.00000
                 0.00000 1.00000 0.00000 0.00000
                 0.00000 0.00000 1.00000 0.00000
                 0.00000 0.00000 0.00000 1.00000

Я использую ограничивающие прямоугольные углы контура в качестве 2D-точек для решенияPNP и 3D-точек из примера MarkerBasedAR

Imgproc.rectangle (rgbaMat, boundRect.tl (), boundRect.br (), CONTOUR_COLOR_WHITE, 2, 8, 0);

rectPoints = new MatOfPoint2f(new Point (boundRect.x, boundRect.y),//l eye
    new Point(boundRect.x + boundRect.width, boundRect.y),
    new Point(boundRect.x, boundRect.y + boundRect.height),
    new Point(boundRect.x + boundRect.width, boundRect.y + boundRect.height)
);

//estimate pose
Mat Rvec = new Mat();
Mat Tvec = new Mat();
Mat raux = new Mat();
Mat taux = new Mat();

List<Point3> m_markerCorners3dList = new List<Point3>();

m_markerCorners3dList.Add(new Point3(-0.5f, -0.5f, 0));
m_markerCorners3dList.Add(new Point3(+0.5f, -0.5f, 0));
m_markerCorners3dList.Add(new Point3(+0.5f, +0.5f, 0));
m_markerCorners3dList.Add(new Point3(-0.5f, +0.5f, 0));

m_markerCorners3d.fromList(m_markerCorners3dList);

Calib3d.solvePnP(m_markerCorners3d, rectPoints, camMatrix, distCoeff, raux, taux);

raux.convertTo(Rvec, CvType.CV_32F);
taux.convertTo(Tvec, CvType.CV_32F);

rotMat = new Mat(3, 3, CvType.CV_64FC1);
Calib3d.Rodrigues(Rvec, rotMat);

transformationM.SetRow(0, new Vector4((float)rotMat.get(0, 0)[0], (float)rotMat.get(0, 1)[0], (float)rotMat.get(0, 2)[0], (float)Rvec.get(0, 0)[0]));
transformationM.SetRow(1, new Vector4((float)rotMat.get(1, 0)[0], (float)rotMat.get(1, 1)[0], (float)rotMat.get(1, 2)[0], (float)Rvec.get(1, 0)[0]));
transformationM.SetRow(2, new Vector4((float)rotMat.get(2, 0)[0], (float)rotMat.get(2, 1)[0], (float)rotMat.get(2, 2)[0], (float)Rvec.get(2, 0)[0]));
transformationM.SetRow(3, new Vector4(0, 0, 0, 1));
Debug.Log ("transformationM " + transformationM.ToString ());

Rvec.Dispose();
Tvec.Dispose();
raux.Dispose();
taux.Dispose();
rotMat.Dispose();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...