Я оцениваю перемещение и вращение одиночной камеры, используя следующий код.
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 «сверху вниз» вид траектории камеры,Я должен построить переводы по плоскости XZ.
plt.plot(path[:,0], path[:,2])
Это совершенно неправильно.
Однако, если я напишу это вместо
plt.plot(path[:,0], path[:,1])
, я получу следующее (после некоторого усреднения)
Этот путь в принципе идеален.Итак, возможно, я неправильно понимаю соглашение о системе координат, используемое cv2.recoverPose
?Почему «вид с высоты птичьего полета» пути камеры должен быть вдоль плоскости XY, а не плоскости XZ?
Другая, возможно, не связанная с этим проблема заключается в том, что сообщаемый Z-перевод, по-видимому, уменьшается линейно, что на самом деле не имеет смысла.
Я почти уверен, что в моем коде есть ошибка, поскольку эти проблемы кажутся систематическими, но я хотел убедиться, что мое понимание системы координат было правильным, чтобы я мог ограничить пространство поиска для отладки.