我试图根据场景中找到的基准标记来确定相机在世界坐标中相对于基准位置的位置。
我确定viewMatrix的方法描述如下:
Determine camera pose?
我具有从受过训练的标记到场景图像的旋转和平移[R | t]。进行摄像机校准培训,从而获得摄像机固有的结果,我应该能够根据场景图像中找到的标记的 Angular 和方向来识别摄像机在世界坐标中的位置。
有人可以引导我进行与此类似的讨论或示例吗?我想根据基准标记了解相机的位置,并且我敢肯定之前已经做过类似的事情,只是我没有搜索正确的关键字。
感谢您的指导。
最佳答案
在世界坐标下你是什么意思?如果要表示对象坐标,则应使用solvepnp
结果的逆变换。
给定一个 View 矩阵[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
在给定一组对象点(模型坐标),其对应的图像投影(图像坐标)以及相机矩阵和失真系数的情况下估计对象姿态。对象姿态由两个 vector
rvec
和tvec
给出。 rvec
是图像上看到的图案 View 的旋转矩阵的紧凑表示。即,rvec
与相应的tvec
一起将基准图案从模型坐标空间(在其中指定了对象点)带到了相机坐标空间。也就是说,我们处于摄影机坐标空间中,它随摄影机一起移动,并且摄影机始终位于原点。相机轴与图像轴的方向相同,因此
这同样适用于模型坐标空间,因此,如果您在基准图案的右上角指定了原点,则
您可以将世界原点指定为对象点的第一个点,即第一个对象设置为
(0, 0, 0)
,所有其他点都具有z=0
(在平面图案的情况下)。然后tvec
(组合的rvec
)指向您放置基准图案的世界坐标空间的原点。 solvePnP
的输出与对象点具有相同的单位。看一下以下内容:6dof positional tracking。我认为这与您需要的非常相似。
关于opencv - 相机框架相对于基准的世界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28402446/