opencv - OpenCV:当我已经拥有投影矩阵P时,为什么要使用solvePnP()?

标签 opencv computer-vision projection triangulation 3d-reconstruction

我已经知道resolvePnP()使用2d点坐标和相应的3d点坐标来找到相机的位置(旋转和平移),但是我不太理解为什么我用2对3d点进行三角剖分后必须使用它相机及其对应的2d点。

因为在对新的3D点进行三角测量时,我已经(需要)两个摄像机的投影矩阵P1和P2(包含R1,R2和t1,t2的旋转和平移,并且已经是新摄像机的位置)三角剖分3D点)。

我的工作流程是:

  • 从2张图像中获取2D对应。
  • 使用这些2D对应关系获取Essential MatrixE。
  • 从基本矩阵E中获取2张图像的相对方向(R,t)。
  • 将camera1的投影矩阵P1设置为

    P1 =(1、0、0、0,
    0、1、0、0,
    0、0、1、0,
    0,0,0,0);

  • 并将camera2的投影矩阵P2设置为
    P2 = (R.at<double>(0, 0), R.at<double>(0, 1), R.at<double>(0, 2), t.at<double>(0),
          R.at<double>(1, 0), R.at<double>(1, 1), R.at<double>(1, 2), t.at<double>(1),
          R.at<double>(2, 0), R.at<double>(2, 1), R.at<double>(2, 2), t.at<double>(2));
    
  • 解决最小二乘问题

    P1 * X = x1
    P2 * X = x2

    (求解X = 3D点)。等等.....

  • 之后,我从这些投影矩阵P1和P2以及x1和x2 2D点对应关系中得到了一个三 Angular 3D点X。

    我的问题再次出现:
    为什么我现在需要使用solvePnP()来获取相机位置?因为我已经有P1和P2,它们应该已经是摄像机的位置(w.r.t.三 Angular 3D点)。

    最佳答案

    您不必每个摄像机都摆姿势-只需相对R | t。您不能以第一台或第二台相机的投影矩阵作为标识-应该进行投影建模。您可以使用平面图案和校准相机方法来计算固有矩阵。

    您可以假设R1 = I且t1 = 0(第一个摄像机的旋转和平移)。因此,R2 = R,t2 = t。三角剖分的3d点将在第一个相机坐标系中具有坐标。

    关于opencv - OpenCV:当我已经拥有投影矩阵P时,为什么要使用solvePnP()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46475833/

    相关文章:

    c++ - OpenCV中int main(int argc, char** argv)中argc和argv的意义

    projection - 将 2D 点反投影到 3D 普拉克线

    java - Hibernate Projections.min() 返回多行

    python - 如何更改 OpenCV 不支持但 v4l2 API 支持的网络摄像头属性?

    c++ - OpenCV动画使用旋转矩阵旋转对象

    python - 在 Python 中使用 CV2 进行实心圆检测?

    OpenCV 胡矩提取

    mongodb - 如何在 MongoDB 聚合管道中隐藏单个子文档?

    python - 使用 opencv 和 python 列出图像中的所有颜色

    opencv - 在WinCE07平台上移植OpenCV