How does cv2.projectPoints actually work?

Car*_*izz 5 opencv projection linear-algebra computer-vision camera-calibration

I'm trying to write my own implementation of cv2.projectPoints just for practice, and my implementation is not behaving as expected.

I'm assuming a pinhole camera with no distortion, so all I'm doing is applying the following equation to all of my planar object points.

在此输入图像描述

假设在某个世界空间(飞机和相机都存在)中,飞机距离 2 个单位。所以,在世界坐标空间中,平面上的所有点都有z=2。然而,在平面自身的坐标空间中,平面上的所有点都有z=0。所以,该向量[X Y Z 1]实际上[X Y 0 1]适用于我尝试投影的所有坐标。假设我发现,在我的姿势估计中,对象沿-2z方向平移。将此向量乘以找到的姿势后,我得到向量......

r11X + r12Y  + t1
r21X + r22Y  + t2
r31X + r32Y  + 2
Run Code Online (Sandbox Code Playgroud)

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

api*_*i55 5

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

X + t1
Y + t2
2
Run Code Online (Sandbox Code Playgroud)

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

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

如果可能的话,最好给出一个带有数字的示例,以了解您实际有多少错误,并看看它是否是由于其他原因造成的......