opencv - 相机框架相对于基准的世界坐标

标签 opencv computer-vision camera-calibration perspectivecamera

我试图根据场景中找到的基准标记来确定相机在世界坐标中相对于基准位置的位置。

我确定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 rvectvec给出。 rvec是图像上看到的图案 View 的旋转矩阵的紧凑表示。即,rvec与相应的tvec一起将基准图案从模型坐标空间(在其中指定了对象点)带到了相机坐标空间。

也就是说,我们处于摄影机坐标空间中,它随摄影机一起移动,并且摄影机始终位于原点。相机轴与图像轴的方向相同,因此
  • x轴指向相机
  • 的右侧
  • y轴指向下方,
  • 和z轴指向相机 View
  • 的方向

    这同样适用于模型坐标空间,因此,如果您在基准图案的右上角指定了原点,则
  • x轴指向右侧(例如,沿着图案的较长边),
  • y轴指向另一侧(例如,沿着较短的一侧)
  • 和z轴指向地面。

  • 您可以将世界原点指定为对象点的第一个点,即第一个对象设置为(0, 0, 0),所有其他点都具有z=0(在平面图案的情况下)。然后tvec(组合的rvec)指向您放置基准图案的世界坐标空间的原点。 solvePnP的输出与对象点具有相同的单位。

    看一下以下内容:6dof positional tracking。我认为这与您需要的非常相似。

    关于opencv - 相机框架相对于基准的世界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28402446/

    相关文章:

    python - 模仿OpenCV中的 "magic wand"photoshop工具

    c++ - 是否可以在 OpenCV 中检测移动物体?

    python - 我如何找到兔子?

    graphics - 如何识别图像中的球并对其进行 3D 建模(HawkEye 系统)

    c++ - 图像裁剪的 OpenCV 相机校准(ROI 子矩阵)

    c++ - 在 opencv 中为任何随机棋盘查找棋盘点(模式大小未知)

    Java openCV - 将位图转换为 Mat 时出错

    matlab - 使用 KNN 进行词袋分类

    c++ - 使用 OpenCV 的目标检测项目

    Python Opencv SolvePnP 产生错误的翻译向量