我尝试使用类似于Features2D + Homography 的方法比较图像以找到已知对象,但用findHomography()
自写findAffine()
函数替换。
我使用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 求解器在工作期间已经在内部完成了。
我怎样才能找回它?在文档中没有找到。