solvePnP fluctuating result
Hi, I am using solvePnp to detect head pose. But estimate result from rotation, translation fluctuating a lots.
solvePnp Call:
cv::solvePnP(model3DPoints, imagePoints, cameraMatrix, dist_coeffs, rotationMat, translationMat);
Camera matrix code:
float focal_length = frame.cols;
cv::Point2d center = cv::Point2d(frame.cols / 2, frame.rows / 2);
cameraMatrix = (cv::Mat_<double>(3,3) << focal_length, 0, center.x, 0 , focal_length, center.y, 0, 0, 1);
Camera matrix value in real time:
640.000000 0.000000 320.000000
0.000000 640.000000 426.000000
0.000000 0.000000 1.000000
Distortion coefficients matrix:
dist_coeffs = cv::Mat::zeros(4,1,cv::DataType<double>::type);
3D Models Points:
model3DPoints.push_back(cv::Point3f(6.825897, 6.760612, 4.402142));
model3DPoints.push_back(cv::Point3f(1.330353, 7.122144, 6.903745));
model3DPoints.push_back(cv::Point3f(-1.330353, 7.122144, 6.903745));
model3DPoints.push_back(cv::Point3f(-6.825897, 6.760612, 4.402142));
model3DPoints.push_back(cv::Point3f(5.311432, 5.485328, 3.987654));
model3DPoints.push_back(cv::Point3f(1.789930, 5.393625, 4.413414));
model3DPoints.push_back(cv::Point3f(-1.789930, 5.393625, 4.413414));
model3DPoints.push_back(cv::Point3f(-5.311432, 5.485328, 3.987654));
model3DPoints.push_back(cv::Point3f(2.005628, 1.409845, 6.165652));
model3DPoints.push_back(cv::Point3f(-2.005628, 1.409845, 6.165652));
model3DPoints.push_back(cv::Point3f(2.774015, -2.080775, 5.048531));
model3DPoints.push_back(cv::Point3f(-2.774015, -2.080775, 5.048531));
model3DPoints.push_back(cv::Point3f(0.000000, -3.116408, 6.097667));
model3DPoints.push_back(cv::Point3f(0.000000, -7.415691, 4.070434));
2D Points value:
(156.139725, 367.403290)
(288.635376, 340.711731)
(358.303589, 343.156128)
(495.513824, 371.169189)
(199.867783, 404.109467)
(272.105225, 411.756317)
(379.791809, 412.740295)
(453.119293, 409.567810)
(276.528778, 520.536621)
(371.074890, 519.674438)
(241.585831, 596.283813)
(409.880096, 592.829407)
(327.109375, 641.688782)
(330.348145, 716.255615)
Only the 2d image point change a bit but the result change a lots.
ROTATION (-3452928277881874609248275663945728.000000, -0.915058, 0.000000)
TRANSLATION (-3635378688.000000, -1.656431, -385174336.000000)
ROTATION (0.000000, -0.899182, 0.005109)
TRANSLATION (0.000000, -1.649161, 1274852533763833856.000000)
ROTATION (-0.000000, -0.953833, 7.130205)
TRANSLATION (-0.000000, -1.669374, -0.001339)
ROTATION (0.000052, 0.986896, 1245620912259072.000000)
TRANSLATION (-0.000000, -1.616727, 0.000000)
please add the solvePnP call
Thank you, I updated my question.
maybe use another flag ? e.g. SOLVEPNP_EPNP works good for me in a very similar program
(and ofc., double check, if your original 2d<-->3d point associations are correct !)
Thank you for the suggestion, the estimated rotation translation results still change a lots. Also I double checked by projectPoints with same 3D points, the rotation, translation from solvePnP result and it gives me not same value as 2d image points.
are you on windows, using VS ?
I am using Mac, Xcode.
naw, ok.
i was more thinking of a win specific problem, when linking debug libs to release projects (the std::vector definitions go out of sync, leads to absurd numbers like yours above)