В надежде на более широкую аудиторию я публикую здесь свой вопрос, который я задал answers.opencv.org также.
TL; DR: Какое отношение должно быть между аргументами, передаваемыми undistortPoints
, findEssentialMat
а также recoverPose
?
У меня есть код, подобный следующему в моей программе, с K
а также dist_coefficients
быть неотъемлемой частью камеры и imgpts.
соответствие характерных точек из 2 изображений.
Mat mask; // inlier mask
undistortPoints(imgpts1, imgpts1, K, dist_coefficients, noArray(), K);
undistortPoints(imgpts2, imgpts2, K, dist_coefficients, noArray(), K);
Mat E = findEssentialMat(imgpts1, imgpts2, 1, Point2d(0,0), RANSAC, 0.999, 3, mask);
correctMatches(E, imgpts1, imgpts2, imgpts1, imgpts2);
recoverPose(E, imgpts1, imgpts2, R, t, 1.0, Point2d(0,0), mask);
я undistort
Очки до нахождения существенной матрицы. В документе говорится, что в качестве последнего аргумента можно передать новую матрицу камеры. Если опущено, точки в нормированный координаты (от -1 до 1). В этом случае я бы ожидал, что я передам 1 для фокусного расстояния и (0,0) для основной точки findEssentialMat
, так как точки нормированы. Так что я думаю, что так будет:
Возможность 1 (нормализовать координаты)
Mat mask; // inlier mask
undistortPoints(imgpts1, imgpts1, K, dist_coefficients);
undistortPoints(imgpts2, imgpts2, K, dist_coefficients);
Mat E = findEssentialMat(imgpts1, imgpts2, 1.0, Point2d(0,0), RANSAC, 0.999, 3, mask);
correctMatches(E, imgpts1, imgpts2, imgpts1, imgpts2);
recoverPose(E, imgpts1, imgpts2, R, t, 1.0, Point2d(0,0), mask);
Возможность 2 (не нормализуйте координаты)
Mat mask; // inlier mask
undistortPoints(imgpts1, imgpts1, K, dist_coefficients, noArray(), K);
undistortPoints(imgpts2, imgpts2, K, dist_coefficients, noArray(), K);
double focal = K.at<double>(0,0);
Point2d principalPoint(K.at<double>(0,2), K.at<double>(1,2));
Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 3, mask);
correctMatches(E, imgpts1, imgpts2, imgpts1, imgpts2);
recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask);
Тем не менее, я обнаружил, что я получаю разумные результаты только тогда, когда говорю undistortPoints
что старая матрица камеры все еще должна быть действительна (я полагаю, в этом случае удаляются только искажения) и передавать аргументы findEssentialMat
как будто точки были нормализованы, что они не являются.
Это ошибка, недостаточная документация или ошибка пользователя?
Обновить
Это может быть correctedMatches
должен вызываться с (ненормализованными) координатами изображения / пикселя и фундаментальной матрицей, а не E, это может быть еще одной ошибкой в моих вычислениях. Это может быть получено F = K^-T * E * K^-1
Как оказалось, мои данные, похоже, отключены. Используя помеченные вручную соответствия, я определил, что Возможность 1 а также 2 действительно правильные, как и следовало ожидать.