Я нахожусь в ситуации, когда мне нужно найти относительные позы камеры между двумя / или более камерами на основе соответствия изображений (чтобы камеры не находились в одной и той же точке). Чтобы решить эту проблему, я попробовал тот же подход, как описано Вот (код ниже).
cv::Mat calibration_1 = ...;
cv::Mat calibration_2 = ...;
cv::Mat calibration_target = calibration_1;
calibration_target.at<float>(0, 2) = 0.5f * frame_width; // principal point
calibration_target.at<float>(1, 2) = 0.5f * frame_height; // principal point
auto fundamental_matrix = cv::findFundamentalMat(left_matches, right_matches, CV_RANSAC);
fundamental_matrix.convertTo(fundamental_matrix, CV_32F);
cv::Mat essential_matrix = calibration_2.t() * fundamental_matrix * calibration_1;
cv::SVD svd(essential_matrix);
cv::Matx33f w(0,-1,0,
1,0,0,
0,0,1);
cv::Matx33f w_inv(0,1,0,
-1,0,0,
0,0,1);
cv::Mat rotation_between_cameras = svd.u * cv::Mat(w) * svd.vt; //HZ 9.19
Но в большинстве случаев я получаю очень странные результаты. Поэтому моей следующей мыслью было использование полноценного регулятора пучка (который должен делать то, что я ищу ?!). В настоящее время моя единственная большая зависимость — это OpenCV, и у них есть только недокументированная реализация настройки пакета.
Итак, вопрос:
заранее спасибо
Я также работаю над той же проблемой и сталкиваюсь с более тонкими проблемами.
Вот некоторые предложения —
Изменить основную матрицу перед разложением:
Модифицируйте Essential matrix перед разложением [U W Vt] = SVD (E), а новый E ‘= diag (s, s, 0), где s = W (0,0) + W (1,1) / 2.
Двухэтапная оценка фундаментальной матрицы:
Пересчитать фундаментальную матрицу с помощью RANSAC
Эти шаги должны сделать оценку вращения более восприимчивой к шуму.
Вы должны получить 4 различных решения и выбрать одно с наибольшим количеством # точек, имеющих положительные координаты Z. Решение генерируется путем инвертирования знака фундаментальной матрицы и замены w на w_inv, чего вы не делали, хотя вычисляли w_inv. Вы используете другой код?