Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

solvePnP fluctuating result

Hi, I am using solvePnp to detect head pose. But estimate result from rotation, translation fluctuating a lots.

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)

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)