相对于基准点的相机框架世界坐标
camera frame world coordinates relative to fiducial
我正在尝试确定相机在世界坐标中的位置,相对于基于场景中找到的基准标记的基准位置。
我确定 viewMatrix 的方法如下:
我有从训练好的标记到场景图像的旋转和平移 [R|t]。鉴于相机校准训练,以及相机固有结果,我应该能够根据在场景图像中找到的标记的视角和方向来辨别相机在世界坐标中的位置。
任何人都可以指导我进行类似的讨论或示例吗?我想知道我的相机基于基准标记的位置,我确信之前已经做过类似的事情,我只是没有搜索正确的关键字。
感谢您的指导。
世界坐标下是什么意思?如果您指的是对象坐标,那么您应该使用 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
一起从模型坐标 space(其中指定了对象点)到相机坐标space.
也就是我们在相机坐标系space,它随着相机移动,相机永远在原点。相机轴与图像轴的方向相同,因此
- x 轴指向相机的右侧,
- y 轴指向下方,
- 并且z轴指向相机视角的方向
这同样适用于模型坐标space,因此如果您将原点指定在基准图案的右上角,则
- x 轴指向右侧(例如沿着图案的较长边),
- y 轴指向另一侧(例如,沿着较短的一侧),
- z轴指向地面
您可以将世界原点指定为对象点的第一个点,即第一个对象设置为 (0, 0, 0)
,所有其他点都具有 z=0
(在平面模式的情况下)。然后 tvec
(组合 rvec
)指向放置基准图案的世界坐标 space 的原点。 solvePnP
的输出与对象点的单位相同。
查看以下内容:6dof positional tracking。我认为这与您需要的非常相似。
我正在尝试确定相机在世界坐标中的位置,相对于基于场景中找到的基准标记的基准位置。
我确定 viewMatrix 的方法如下:
我有从训练好的标记到场景图像的旋转和平移 [R|t]。鉴于相机校准训练,以及相机固有结果,我应该能够根据在场景图像中找到的标记的视角和方向来辨别相机在世界坐标中的位置。
任何人都可以指导我进行类似的讨论或示例吗?我想知道我的相机基于基准标记的位置,我确信之前已经做过类似的事情,我只是没有搜索正确的关键字。
感谢您的指导。
世界坐标下是什么意思?如果您指的是对象坐标,那么您应该使用 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
一起从模型坐标 space(其中指定了对象点)到相机坐标space.
也就是我们在相机坐标系space,它随着相机移动,相机永远在原点。相机轴与图像轴的方向相同,因此
- x 轴指向相机的右侧,
- y 轴指向下方,
- 并且z轴指向相机视角的方向
这同样适用于模型坐标space,因此如果您将原点指定在基准图案的右上角,则
- x 轴指向右侧(例如沿着图案的较长边),
- y 轴指向另一侧(例如,沿着较短的一侧),
- z轴指向地面
您可以将世界原点指定为对象点的第一个点,即第一个对象设置为 (0, 0, 0)
,所有其他点都具有 z=0
(在平面模式的情况下)。然后 tvec
(组合 rvec
)指向放置基准图案的世界坐标 space 的原点。 solvePnP
的输出与对象点的单位相同。
查看以下内容:6dof positional tracking。我认为这与您需要的非常相似。