【发布时间】:2019-05-08 17:08:53
【问题描述】:
我正在使用以下代码估算单个相机的平移和旋转。
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 是我匹配的一组关键点,它们是 Nx2 矩阵,其中第一列是 x 坐标,第二列是 y 坐标。
我收集了几帧上的所有翻译,并生成了相机这样行进的路径。
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 平移似乎呈线性下降,这实际上没有任何意义。
我很确定我的代码中存在错误,因为这些问题看起来是系统性的 - 但我想确保我对坐标系的理解是正确的,以便我可以限制搜索空间以进行调试。
【问题讨论】:
-
看看stackoverflow.com/questions/37810218/… 和那里引用的参考资料。它可能会给你一个提示。
标签: python opencv camera-calibration robotics