我正在尝试确定相对于基于场景中找到的基准标记的基准位置的世界坐标中的摄像机位置。
我在这里描述了确定viewMatrix的方法: Determine camera pose?
我有从训练的标记到场景图像的旋转和平移[R | t]。鉴于相机校准训练,以及相机内在结果,我应该能够基于视角和视角来辨别相机在世界坐标中的位置。在场景图像中找到的标记的方向。
有人可以指导我进行类似的讨论或示例吗?我想知道基于基准标记的相机位置,我确信之前已经做过类似的事情,我只是没有搜索正确的关键字。
感谢您的指导。
答案 0 :(得分:1)
在世界坐标下你是什么意思?如果你的意思是对象坐标,那么你应该使用solvepnp
的结果的逆变换。
给定一个视图矩阵[R|t]
,我们有inv([R|t]) = [R'|-R'*t]
,其中R'
是R
的转置。在OpenCV中:
cv::Mat rvec, tvec;
cv::solvePnP(objectPoints, imagePoints, intrinsics, distortion, rvec, tvec);
cv::Mat R;
cv::Rodrigues(rvec, rotation);
R = R.t(); // inverse rotation
tvec = -R * tvec; // translation of inverse
// camPose is a 4x4 matrix with the pose of the camera in the object frame
cv::Mat camPose = cv::Mat::eye(4, 4, R.type());
R.copyTo(camPose.rowRange(0, 3).colRange(0, 3)); // copies R into camPose
tvec.copyTo(camPose.rowRange(0, 3).colRange(3, 4)); // copies tvec into camPose
更新#1:
solvePnP
solvePnP
估计对象姿势给定一组对象点(模型坐标),它们对应的图像投影(图像坐标),以及相机矩阵和失真系数。
对象姿势由两个向量rvec
和tvec
给出。 rvec
是图像上看到的图案视图的旋转矩阵的紧凑表示。也就是说,rvec
和相应的tvec
将基准模式从模型坐标空间(其中指定了对象点)带到摄像机坐标空间< / em>的
也就是说,我们处于摄像机坐标空间,它与摄像机一起移动,摄像机始终位于原点。相机轴与图像轴的方向相同,所以
同样适用于模型坐标空间,因此如果您在基准图案的右上角指定了原点,那么
您可以将世界原点指定为对象点的第一个点,即第一个对象设置为(0, 0, 0)
,所有其他点都具有z=0
(如果是平面图案)。然后tvec
(合并rvec
)指向您放置基准图案的世界坐标空间的原点。 solvePnP
的输出与对象点的单位相同。
请看以下内容:6dof positional tracking。我认为这与您的需求非常相似。