13template <camera_model CameraT>
17 std::vector<std::array<double, 3>>
c_tra_t;
18 std::array<double, intr_size>
intr{};
23 const std::vector<Eigen::Isometry3d>& init_c_se3_t) {
24 const size_t num_views = init_c_se3_t.size();
28 for (
size_t v = 0; v < num_views; ++v) {
35 std::vector<ParamBlock> blocks;
43 [](
const auto& i) { return ParamBlock{i.data(), i.size(), 3}; });
46 std::transform(
c_tra_t.begin(),
c_tra_t.end(), std::back_inserter(blocks),
47 [](
const auto& i) { return ParamBlock{i.data(), i.size(), 3}; });
53 const size_t num_views = c_quat_t.size();
54 result.
c_se3_t.resize(num_views);
57 for (
size_t v = 0; v < num_views; ++v) {
63template <camera_model CameraT>
64static ceres::Problem
build_problem(
const std::vector<PlanarView>& views,
68 for (
size_t view_idx = 0; view_idx < views.size(); ++view_idx) {
69 const auto& view = views[view_idx];
71 opts.
core.huber_delta > 0 ?
new ceres::HuberLoss(opts.
core.huber_delta) :
nullptr;
77 for (
auto& c_quat_t : blocks.
c_quat_t) {
78 p.SetManifold(c_quat_t.data(),
new ceres::QuaternionManifold());
84 p.SetManifold(blocks.
intr.data(),
93 if (views.size() < 4) {
94 throw std::invalid_argument(
"Insufficient views for calibration (at least 4 required).");
98template <camera_model CameraT>
100 std::vector<Eigen::Isometry3d> init_c_se3_t,
111 blocks.populate_result(result);
112 if (opts.core.compute_covariance) {
114 if (optcov.has_value()) {
124 std::vector<Eigen::Isometry3d> init_c_se3_t,
129 const std::vector<PlanarView>& views,
Pinhole camera model with intrinsics and distortion correction.
Lens distortion models and correction algorithms.
Linear multi-camera extrinsics initialisation (DLT)
void populate_quat_tran(const Eigen::Isometry3d &pose, std::array< double, 4 > &quat, std::array< double, 3 > &translation)
auto optimize_intrinsics(const std::vector< PlanarView > &views, const CameraT &init_camera, std::vector< Eigen::Isometry3d > init_c_se3_t, const IntrinsicsOptimOptions &opts={}) -> IntrinsicsOptimizationResult< CameraT >
static ceres::Problem build_problem(const std::vector< PlanarView > &views, const IntrinsicsOptimOptions &opts, IntrinsicBlocks< CameraT > &blocks)
void validate_input(const std::vector< BundleObservation > &observations, const std::vector< CameraT > &initial_cameras)
Eigen::Isometry3d restore_pose(const std::array< double, 4 > &quat, const std::array< double, 3 > &translation)
auto compute_covariance(const ProblemParamBlocks &problem_param_blocks, ceres::Problem &problem, double sum_squared_residuals=0, size_t total_residuals=0) -> std::optional< Eigen::MatrixXd >
void solve_problem(ceres::Problem &problem, const OptimOptions &opts, OptimResult *result)
Type traits template for camera model implementations.
void populate_result(IntrinsicsOptimizationResult< CameraT > &result) const
std::array< double, intr_size > intr
std::vector< std::array< double, 3 > > c_tra_t
std::vector< ParamBlock > get_param_blocks() const override
IntrinsicBlocks(size_t numviews)
std::vector< std::array< double, 4 > > c_quat_t
static constexpr size_t intr_size
static IntrinsicBlocks create(const CameraT &camera, const std::vector< Eigen::Isometry3d > &init_c_se3_t)
OptimOptions core
Non-linear optimization options.
bool optimize_skew
Estimate skew parameter.
OptimResult core
Optimization result details.
CameraT camera
Estimated camera parameters.
std::vector< Eigen::Isometry3d > c_se3_t
Estimated pose of each view.
Eigen::MatrixXd covariance
Camera model with a tilted sensor plane (Scheimpflug configuration).