cv2.projectPoints 是如何运作的?

How does cv2.projectPoints actually work?

我正在尝试编写自己的 cv2.projectPoints 实现只是为了练习,但我的实现没有按预期运行。

我假设针孔相机没有失真,所以我所做的就是将以下等式应用于我所有的平面物点。

假设在某个世界space(飞机和相机都存在于其中),飞机距离我们有 2 个单位。所以,在世界坐标space中,平面上的所有点都有z=2。但是,在平面自身的坐标space中,平面上所有的点都有z=0。因此,矢量 [X Y Z 1] 实际上是 [X Y 0 1] 我要投影的所有坐标。假设我发现,在我的姿势估计中,对象在 z 方向上平移 -2。将这个向量乘以找到的姿势后,我得到向量...

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

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

项目积分与您描述的公式一样有效。在没有旋转的简单情况下(旋转矩阵是单位矩阵)你会在最后得到类似的东西:

X + t1
Y + t2
2

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

还有一点,一旦你乘以整个公式,你将得到一个 3D 向量,你必须将向量除以最后一个分量以获得 2D 投影点。

如果可能的话,你最好用数字举例来了解你实际有多少错误,看看它是否是由于其他原因造成的...