我尝试编写自己的cv2.projectPoints实现只是为了练习,而我的实现并没有按预期运行。
我假设没有失真的针孔相机,所以我所做的就是将以下等式应用于我的所有平面物点。
让我们说在某个世界空间(飞机和相机都存在),飞机距离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
。
答案 0 :(得分:2)
项目点的工作方式与您描述的公式相同。在没有旋转的简单情况下(旋转矩阵是同一性),你会得到类似的结果:
X + t1
Y + t2
2
这正是您所期望的。你正在使用一个姿势估计,这意味着这个简单的情况几乎永远不会,因为你总会有一些错误,但应该很小......这意味着最后r31X + r32Y
应该导致一些东西接近0.如果不是这种情况,则姿势估计可能有误差。另外,请考虑两个值也可以相互抵消。
还有一件事,一旦你将WHOLE公式相乘,你将获得一个3D矢量,你必须将矢量除以最后一个分量才能获得2D投影点。
如果可能的话,如果可能的话,你会给出一个数字示例,以了解你实际拥有多少错误,看看是否是由于另一件事......