代码之家  ›  专栏  ›  技术社区  ›  Carpetfizz

projectpoints实际上是如何工作的?

  •  1
  • Carpetfizz  · 技术社区  · 6 年前

    我在写我自己的实现 cv2.projectPoints 只是为了练习,而我的实现并没有按预期进行。

    我假设一个针孔相机没有变形,所以我所做的就是把下面的方程应用到我所有的平面物体点上。

    enter image description here

    假设在某个世界空间(平面和相机都存在于其中),平面距离我们2个单位。所以,在世界坐标空间中,平面上的所有点 z=2 . 但是,在平面自身的坐标空间中,平面上的所有点都有 z=0 . 那么,向量 [X Y Z 1] 实际上是 [X Y 0 1] 所有我想投射的坐标。假设我发现,在我的姿势估计中,物体被转换了 -2 z 方向。把这个向量乘以找到的姿势,我得到向量…

    r11X + r12Y  + t1
    r21X + r22Y  + t2
    r31X + r32Y  + 2
    

    但是现在,投影点不再有 z = 2 因为 r31 r32 .

    1 回复  |  直到 6 年前
        1
  •  2
  •   api55    6 年前

    项目点的工作原理与您描述的公式相同。在没有旋转的简单情况下(旋转矩阵是恒等式),你会得到如下结果:

    X + t1
    Y + t2
    2
    

    这正是你所期望的。你使用的是姿势估计,这意味着这个简单的情况几乎永远不会,因为你总是会有一些错误,但应该是相当小的…这意味着最后 r31X + r32Y 应该会导致接近0的结果。如果不是这样,则姿势估计可能有错误。另外,考虑这两个值也可以互相抵消。

    还有一件事,一旦你将整个公式相乘,你将得到一个三维矢量,你必须把矢量除以最后一个分量,才能得到二维投影点。

    如果可能的话,你可以举一个有数字的例子来理解你实际上有多少错误,看看是不是由于另一件事…