2016-05-22 4 views
0

Я пытаюсь сравнить изображения, используя метод, аналогичный Features2D + Homography to find a known object, но замените findHomography() на самообману findAffine() функция.Как получить выбросы от результата решателя ceres?

Я использую Ceres Solver для получения оптимальной аффинной матрицы с учетом выбросов.

double translation[] = {0, 0}; 
    double angle = 0; 
    double scaleFactor = 1; 

    ceres::Problem problem; 


    for (size_t i = 0; i < points1.size(); ++i) { 
     problem.AddResidualBlock(
        new ceres::AutoDiffCostFunction<AffineResidual, 1, 2, 1, 1>(
          new AffineResidual(Eigen::Vector2d(points1[i].x, points1[i].y), 
              Eigen::Vector2d(points2[i].x, points2[i].y))), 
          new ceres::HuberLoss(1.0), 
          translation, 
          &angle, 
          &scaleFactor); 
    } 

    ceres::Solver::Options options; 
    options.linear_solver_type = ceres::DENSE_QR; 
    options.minimizer_progress_to_stdout = true; 

    ceres::Solver::Summary summary; 
    Solve(options, &problem, &summary); 

Восковины решатель обеспечивает LossFunction:

функции потерь уменьшить влияние остаточных блоков с высокими невязок, как правило, те, соответствующие выбросам.

Конечно, я могу преобразовать координаты ключевых точек из первого изображения по полученной матрице, сравнить со вторым и получить отклонение. Но ceres solver уже сделал это внутри во время работы.

Как я могу его получить? Не нашли его в документации.

+0

Может ли кто-нибудь объяснить мне, почему вопрос ниспровергнут? – victor1234

ответ

2

У меня была аналогичная проблема. Изучив источники библиотеки Ceres (в частности, в метод ResidualBlock :: Evaluate()), я пришел к выводу, что для остаточного блока нет явного статуса «outlier». Кажется, что функция потерь просто влияет на итоговое значение стоимости для блока (что точно описано фразой из документации, которую вы указали - «Функции потерь уменьшают влияние остаточных блоков с высокими остатками»). Таким образом, ответ заключается в том, что вы не можете извлекать выбросы от Цереры, такой функции нет.

Обходным решением может быть вычисление остатков для ваших данных с решенным результатом и применение к ним функции потерь. Комментарий от LossFunction :: Evaluate() может помочь:

// For a residual vector with squared 2-norm 'sq_norm', this method 
// is required to fill in the value and derivatives of the loss 
// function (rho in this example): 
// 
// out[0] = rho(sq_norm), 
// out[1] = rho'(sq_norm), 
// out[2] = rho''(sq_norm), 
// 
// Here the convention is that the contribution of a term to the 
// cost function is given by 1/2 rho(s), where 
// 
// s = ||residuals||^2. 
// 
// Calling the method with a negative value of 's' is an error and 
// the implementations are not required to handle that case. 
// 
// Most sane choices of rho() satisfy: 
// 
// rho(0) = 0, 
// rho'(0) = 1, 
// rho'(s) < 1 in outlier region, 
// rho''(s) < 0 in outlier region, 
// 
// so that they mimic the least squares cost for small residuals. 
virtual void Evaluate(double sq_norm, double out[3]) const = 0; 
Смежные вопросы