Skip to content

Commit dfa06af

Browse files
authored
feat(ceres_intrinsic_camera_calibrator): soften coeffs residuals (tier4#226)
* feat(ceres_intrinsic_camera_calibrator): set threshold for clamping residuals Signed-off-by: Amadeusz Szymko <[email protected]> * feat(ceres_intrinsic_camera_calibrator): remove threshold & use log function for residuals Signed-off-by: Amadeusz Szymko <[email protected]> * feat(intrinsic_camera_calibrator): logging Signed-off-by: Amadeusz Szymko <[email protected]> * feat(ceres_intrinsic_camera_calibrator): ignore regularization for 0.0 weight Signed-off-by: Amadeusz Szymko <[email protected]> --------- Signed-off-by: Amadeusz Szymko <[email protected]>
1 parent a30037d commit dfa06af

File tree

3 files changed

+32
-17
lines changed

3 files changed

+32
-17
lines changed

calibrators/intrinsic_camera_calibrator/ceres_intrinsic_camera_calibrator/include/ceres_intrinsic_camera_calibrator/distortion_coefficients_residual.hpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,29 @@ struct DistortionCoefficientsResidual
5656
const T & k6 =
5757
rational_distortion_coeffs_ > 2 ? camera_intrinsics[distortion_index++] : null_value;
5858

59-
residuals[0] = k1;
60-
residuals[1] = k2;
61-
residuals[2] = k3;
62-
residuals[3] = p1;
63-
residuals[4] = p2;
64-
residuals[5] = k4;
65-
residuals[6] = k5;
66-
residuals[7] = k6;
59+
residuals[0] = getResidual(k1);
60+
residuals[1] = getResidual(k2);
61+
residuals[2] = getResidual(k3);
62+
residuals[3] = getResidual(p1);
63+
residuals[4] = getResidual(p2);
64+
residuals[5] = getResidual(k4);
65+
residuals[6] = getResidual(k5);
66+
residuals[7] = getResidual(k6);
6767

6868
return true;
6969
}
7070

71+
/*!
72+
* Calculates the residual for a given distortion coefficient
73+
* @param[in] value The distortion coefficient
74+
* @returns The residual
75+
*/
76+
template <typename T>
77+
T getResidual(const T & value) const
78+
{
79+
return ceres::log(ceres::abs(value) + T(1.0));
80+
}
81+
7182
/*!
7283
* Residual factory method
7384
* @param[in] radial_distortion_coeffs The number of radial distortion coefficients

calibrators/intrinsic_camera_calibrator/ceres_intrinsic_camera_calibrator/src/ceres_camera_intrinsics_optimizer.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -360,13 +360,15 @@ void CeresCameraIntrinsicsOptimizer::solve()
360360
}
361361
}
362362

363-
problem.AddResidualBlock(
364-
DistortionCoefficientsResidual::createResidual(
365-
radial_distortion_coefficients_, use_tangential_distortion_,
366-
rational_distortion_coefficients_),
367-
new ceres::ScaledLoss(
368-
nullptr, regularization_weight_ * object_points_.size(), ceres::TAKE_OWNERSHIP), // L2
369-
intrinsics_placeholder_.data());
363+
if (regularization_weight_ > 0.0) {
364+
problem.AddResidualBlock(
365+
DistortionCoefficientsResidual::createResidual(
366+
radial_distortion_coefficients_, use_tangential_distortion_,
367+
rational_distortion_coefficients_),
368+
new ceres::ScaledLoss(
369+
nullptr, regularization_weight_ * object_points_.size(), ceres::TAKE_OWNERSHIP), // L2
370+
intrinsics_placeholder_.data());
371+
}
370372

371373
double initial_cost = 0.0;
372374
std::vector<double> residuals;
@@ -376,7 +378,7 @@ void CeresCameraIntrinsicsOptimizer::solve()
376378
problem.Evaluate(eval_opt, &initial_cost, &residuals, nullptr, nullptr);
377379

378380
if (verbose_) {
379-
std::cout << "Initial cost: " << initial_cost;
381+
std::cout << "Initial cost: " << initial_cost << std::endl;
380382
}
381383

382384
ceres::Solver::Options options;
@@ -392,6 +394,6 @@ void CeresCameraIntrinsicsOptimizer::solve()
392394
ceres::Solve(options, &problem, &summary);
393395

394396
if (verbose_) {
395-
std::cout << "Report: " << summary.FullReport();
397+
std::cout << "Report: " << std::endl << summary.FullReport() << std::endl;
396398
}
397399
}

calibrators/intrinsic_camera_calibrator/intrinsic_camera_calibrator/intrinsic_camera_calibrator/camera_calibrator.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,8 @@ def process_calibration_results(
811811
self.calibration_evaluation_inlier_rms_label.setText(
812812
f"\trms error (inliers): {evaluation_inlier_rms_error:.3f}" # noqa E231
813813
)
814+
logging.info(f"Camera matrix:\n{calibrated_model.k}")
815+
logging.info(f"Distortion coefficients:\n{calibrated_model.d}")
814816

815817
self.calibrator_type_combobox.setEnabled(True)
816818
self.calibration_parameters_button.setEnabled(True)

0 commit comments

Comments
 (0)