2016-05-22 27 views
0

我尝试使用类似于Features2D + Homography to find a known object的方法比较图像,但用自编的findAffine()函数代替findHomography()如何从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); 

的Ceres提供解算器LossFunction

损失函数减少残余块的影响具有高的残差,通常对应于异常值的那些。

当然,我可以通过获得矩阵转换第一幅图像的关键点坐标,与第二幅图像进行比较并得到偏差。但是Ceres求解器在工作中已经完成了它。

我如何检索它?没有在文档中找到它。

+0

任何人都可以解释为什么问题是downvoted? – victor1234

回答

2

我有类似的问题。在查看Ceres库资源(特别是进入ResidualBlock :: Evaluate()方法)之后,我得出结论:残余块没有明确的“异常”状态。看起来,损失函数只影响块的结果成本值(这正好由您引用的文档中的短语描述 - “损失函数减少残差高的残余块的影响”)。所以答案是你无法从Ceres中检索异常值,没有这样的功能。

解决方法可能是使用求解结果计算数据的残差,并将损失函数应用于它们。来自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;