如何使用 cv2.triangulatePoints?

问题描述

这是我的代码

R = np.linalg.inv(R2) @ R1
t = t2 - (R @ t1)

P1 = K @ np.append(np.eye(3),np.zeros((3,1)),axis=1)
P2 = K @ np.append(R,t,axis=1)

points3d = cv2.triangulatePoints(P1,P2,mid1,mid2)
points3d /= points3d[3]
x,y,z,_ = points3d.flatten()

R1 和 R2 分别是第一帧和第二帧的旋转矩阵。 t1 和 t2 分别是第一帧和第二帧的平移向量。我的程序在一个视频源上工作,其中正在查看一个对象,并且相机围绕它移动以从不同的角度查看它。内在矩阵 (K) 和 R_n(第 n 帧的旋转矩阵)都是准确已知的(感谢 Google ARCore 库)。

所以,一开始,三角测量是使用第0帧和第1帧的相机参数完成的。然后,使用第0帧和第2帧重复该过程。随着视频的进行,使用帧重复三角测量的过程0 和第 10 帧。依此类推。我试图在 3D 空间中定位的像素是使用 YOLO 获得的 2D 边界框的中点。有问题的对象是一个杯子。因此,中点不应该有很大差异。

然而,当相机四处移动时,三角点的值会发生相当大的变化。因此,例如,一开始,三角点的值是 (1.0,2.3,3.4)。然后,当我的相机围绕杯子移动并从它的左侧以稍远的距离观察时,三角点的值会跃升至 (10.0,15.3,6.7)。这是仅仅 10 帧之后!而且这个值一直在跳动。如果我根本不移动我的相机,那么我会得到稳定的距离值。

我的代码有问题吗?三角测量理论上应该可以工作,我应该得到 2D 像素的 3D 位置的稳定值。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)