使用以下代码估算单个相机的平移和旋转。
Original Answer翻译成"最初的回答"
E, mask = cv2.findEssentialMat(k1, k2,
focal = SCALE_FACTOR * 2868
pp = (1920/2 * SCALE_FACTOR, 1080/2 * SCALE_FACTOR),
method = cv2.RANSAC,
prob = 0.999,
threshold = 1.0)
points, R, t, mask = cv2.recoverPose(E, k1, k2)
k1
和k2
我在几个帧中收集所有的翻译,并生成了摄像机行进路径,如下图所示:
def generate_path(rotations, translations):
path = []
current_point = np.array([0, 0, 0])
for R, t in zip(rotations, translations):
path.append(current_point)
# don't care about rotation of a single point
current_point = current_point + t.reshape((3,)
return np.array(path)
所以,我有几个问题。
- OpenCV相机坐标系建议,如果我想查看相机路径的2D“俯视”视图,则应沿X-Z平面绘制平移。
plt.plot(path[:,0], path[:,2])
这是完全错误的。
但是,如果我改为写成这个样子:
plt.plot(path[:,0], path[:,1])
我得到了以下结果(进行了一些平均处理):
这条路径基本上是完美的。
那么,也许我误解了cv2.recoverPose
使用的坐标系约定?为什么相机路径的“鸟瞰图”应该沿XY平面而不是XZ平面?
- 另一个可能无关的问题是,报告的Z平移呈线性下降趋势,这真的没有意义。
我很确定我的代码中有一个错误,因为这些问题似乎是系统性的-但我想确保我的坐标系的理解是正确的,这样我就可以限制调试的搜索空间。