undistortPoints, findEssentialMat, recoverPose: Какова связь между их аргументами?

В надежде на более широкую аудиторию я публикую здесь свой вопрос, который я задал 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. Возможность 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. Возможность 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

2

Решение

Как оказалось, мои данные, похоже, отключены. Используя помеченные вручную соответствия, я определил, что Возможность 1 а также 2 действительно правильные, как и следовало ожидать.

0

Другие решения


По вопросам рекламы [email protected]