我正在尝试使用我的网络摄像头从具有已知全局位置的四个基准点的图像中获得全局姿态估计。
我检查了许多 stackexchange 问题和一些论文,但似乎无法得到正确的解决方案。我得到的位置数字是可重复的,但绝不与相机移动成线性比例。仅供参考,我正在使用 C++ OpenCV 2.1。
在此链接上显示了我的坐标系和下面使用的测试数据。
% Input to solvePnP():
imagePoints = [ 481, 831; % [x, y] format
520, 504;
1114, 828;
1106, 507]
objectPoints = [0.11, 1.15, 0; % [x, y, z] format
0.11, 1.37, 0;
0.40, 1.15, 0;
0.40, 1.37, 0]
% camera intrinsics for Logitech C910
cameraMat = [1913.71011, 0.00000, 1311.03556;
0.00000, 1909.60756, 953.81594;
0.00000, 0.00000, 1.00000]
distCoeffs = [0, 0, 0, 0, 0]
% output of solvePnP():
tVec = [-0.3515;
0.8928;
0.1997]
rVec = [2.5279;
-0.09793;
0.2050]
% using Rodrigues to convert back to rotation matrix:
rMat = [0.9853, -0.1159, 0.1248;
-0.0242, -0.8206, -0.5708;
0.1686, 0.5594, -0.8114]
到目前为止,有人能看出这些数字有什么问题吗?如果有人将它们签入例如 MatLAB(上面的代码对 m 文件友好),我将不胜感激。
从这一点来看,我不确定如何从 rMat 和 tVec 获得全局姿势。从我在这个问题中读到的内容,从 rMat 和 tVec 获取姿势很简单:
position = transpose(rMat) * tVec % matrix multiplication
但是,我从其他来源怀疑我读过它并不是那么简单。
要获得相机在现实世界坐标中的位置,我需要做什么? 由于我不确定这是否是一个实现问题(但很可能是一个理论问题),我希望在 OpenCV 中成功使用 solvePnP 函数的人来回答这个问题,尽管也欢迎任何想法!
非常感谢您的宝贵时间。