Я работаю над графиком SLAM и оцениваю методы на наборе данных KITTI. Я использую метод openCv solvePnPRansa c, чтобы оценить позу заданных трехмерных точек и соответствующих им двухмерных проекций. В большинстве случаев он работает нормально, но в некоторых ситуациях метод оценивает неправильные позы, поскольку точки 3D-сцены не проецируются на соответствующие им 2D-координаты.
Примечание. На приведенных ниже изображениях показаны только внутренние 3D-точки и соответствующие им Возможности.
Результатом успешной оценки позы является изображение такого типа, в котором проекция точек трехмерной сцены (желтая звезда) с использованием оценочной матрицы камеры попадает в двумерные объекты (красный круг).
КАДР 274
FRAME290
FRAME 304
A неправильная оценка позы приводит к изображению ниже. Есть только 3 вкладыша (количество вкладышей обычно не слишком много). Все три точки 3D-сцены проецируются на одну и ту же 2D-функцию, что неверно.
КАДР 305
Я был бы очень признателен, если бы кто-то мог предложить решение.
Вот часть моей функции, которую я использую для оценки позы: rotVe c - это исходное предположение о ориентации в виде вектора вращения, а frame.position - начальное предположение о положении (оба получены из модели движения. )
def refinePoseV2(self, frame, mapPoints, features):
distCoeff = np.zeros((4,1))
points3D = np.vstack([pt.position for pt in mapPoints])
features2D = np.vstack([pt.feature.pt for pt in features])
rotVec = Rotation.from_matrix(frame.orientation.R).as_rotvec()
success, rotation_vector, translation_vector, inliers = cv.solvePnPRansac( points3D, features2D,
frame.cam.calibrationMatrix1,
distCoeff, reprojectionError=1,
useExtrinsicGuess=True,
rvec=rotVec, tvec=frame.position,
flags=cv.SOLVEPNP_P3P)