世界坐标系中的相机位置不起作用,但相机坐标系中的对象姿势正常

时间:2018-06-29 08:30:46

标签: c++ computer-vision opencv3.0 pose-estimation opencv-solvepnp

我正在使用solvepnp在使用LED作为标记的头戴式设备(Hololens)的相机(iphone相机)姿势估计上进行工作。我已经校准了下面的相机是相机的内在参数

CC --version

下面的代码可以在相机坐标系中获得正确的物体姿势

/* approx model*/
double focal_length = image.cols;
Point2d center = cv::Point2d(image.cols/2,image.rows/2);
iphone_camera_matrix = (cv::Mat_<double>(3,3) << focal_length, 0,    center.x, 0 , focal_length, center.y, 0, 0, 1);
iphone_dist_coeffs = cv::Mat::zeros(4,1,cv::DataType<double>::type); 
/* caliberated(usng opencv) model */
iphone_camera_matrix = (cv::Mat_<double>(3,3) <<839.43920487140315, 0, 240, 0, 839.43920487140315, 424, 0, 0, 1);
iphone_dist_coeffs = (cv::Mat_<double>(5,1) <<4.6476561543838640e-02, -2.0580084834071521, 0, 0 ,2.0182662261396342e+01);

输出是

cv::solvePnP(world_points, image_points, iphone_camera_matrix, iphone_dist_coeffs, rotation_vector, translation_vector, true, SOLVEPNP_ITERATIVE);

使用此rotation_vector和translation_vector通过投影点为三的向量来可视化姿势

rotation_vector :
[-65.41956646885059;
 -52.49185328449133;
 36.82917796058498]

translation_vector :
[94.1158604375937;
 -164.2178023980637;
 580.5666657301058]

projectedPoints的输出为

points_to_project :
[0, 0, 0;
 20, 0, 0;
 0, 20, 0;
 0, 0, 20]

projectPoints(points_to_project, rotation_vector, translation_vector, iphone_camera_matrix, iphone_dist_coeffs, projected_points);

看起来正确,如下所示

object pose in camera co-ordinate system

我尝试通过使用solvepnp给定的rotation_vector和translate_vector的变换找到世界/对象坐标系中的相机姿势

projected_points :
[376.88803, 185.15131;
 383.05768, 195.77643;
 406.46454, 175.12997;
 372.67371, 155.56181]

我使用了rot_matrix_wld,translation_vec_wld来可视化该姿势(与我如上所述在相机坐标系中可视化该对象的姿势的方式相同)

cv::Rodrigues(rotation_vector, rotation_matrix);
rot_matrix_wld = rotation_matrix.t();
translation_vec_wld = -rot_matrix_wld * translation_vector;

使用

projectPoints(points_to_project, rot_matrix_wld, translation_vec_wld, iphone_camera_matrix, iphone_dist_coeffs, projected_points);

错误的翻译矢量(在2个projected_points以下是视频的2个不同图像帧)

points_to_project :
[0, 0, 0;
 20, 0, 0;
 0, 20, 0;
 0, 0, 20]

我使用的近似相机模型和校准的相机模型都给出了错误的平移矢量。

我已经通过链接here并验证了我的校准程序,我正确地做到了。

我不确定哪里做错了,谁能帮助我解决这个问题。

提前谢谢。

0 个答案:

没有答案