OpenCV recoverPose система координат камеры - PullRequest
0 голосов
/ 08 мая 2019

Я оцениваю перемещение и вращение одиночной камеры, используя следующий код.

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)

Итак, у меня есть несколько проблем с этим.

  1. Система координат камеры OpenCV предполагает, что если я хочу просмотреть 2D «сверху вниз» вид траектории камеры,Я должен построить переводы по плоскости XZ.

plt.plot(path[:,0], path[:,2])

enter image description here

Это совершенно неправильно.

Однако, если я напишу это вместо

plt.plot(path[:,0], path[:,1])

, я получу следующее (после некоторого усреднения)

enter image description here

Этот путь в принципе идеален.Итак, возможно, я неправильно понимаю соглашение о системе координат, используемое cv2.recoverPose?Почему «вид с высоты птичьего полета» пути камеры должен быть вдоль плоскости XY, а не плоскости XZ?

Другая, возможно, не связанная с этим проблема заключается в том, что сообщаемый Z-перевод, по-видимому, уменьшается линейно, что на самом деле не имеет смысла.

enter image description here

Я почти уверен, что в моем коде есть ошибка, поскольку эти проблемы кажутся систематическими, но я хотел убедиться, что мое понимание системы координат было правильным, чтобы я мог ограничить пространство поиска для отладки.

1 Ответ

0 голосов
/ 21 мая 2019

В самом начале, на самом деле, ваш метод не дает реального пути.Трансляция t, создаваемая recoverPose (), всегда является единичным вектором.Таким образом, в вашем «пути» каждый кадр движется ровно на 1 «метр» от предыдущего кадра.Правильный метод будет: 1) инициализировать: (featureMatch, findEssentialMatrix, recoverPose), затем 2) отслеживать: (triangluate, featureMatch, solvePnP).Если вы хотите копать глубже, вам поможет поиск учебников по Monocular Visual SLAM.

Во-вторых, вы могли запутаться в системе координат камеры и мировой системе координат.Если вы хотите построить траекторию, вы должны использовать мировую систему координат, а не систему координат камеры.Кроме того, результаты recoverPose () также находятся в мировой системе координат.И мировая система координат такова: ось x направлена ​​вправо, ось y направлена ​​вперед, ось z направлена ​​вверх. Таким образом, если вы хотите построить «птичий вид», то правильно, что вы должны рисовать вдоль XYсамолет.

...