30 if (views.empty() || cameras.empty()) {
31 throw std::runtime_error(
"Empty views or cameras provided");
34 const size_t num_cameras = cameras.size();
35 const size_t num_views = views.size();
38 std::vector<std::vector<Eigen::Isometry3d>> cam_se3_ref(
39 num_views, std::vector<Eigen::Isometry3d>(num_cameras, Eigen::Isometry3d::Identity()));
41 for (
size_t view_idx = 0; view_idx < num_views; ++view_idx) {
42 const auto& view = views[view_idx];
43 if (view.size() != num_cameras) {
44 throw std::runtime_error(
45 "View " + std::to_string(view_idx) +
" has wrong number of cameras: expected " +
46 std::to_string(num_cameras) +
", got " + std::to_string(view.size()));
48 for (
size_t cam_idx = 0; cam_idx < num_cameras; ++cam_idx) {
54 std::vector<Eigen::Isometry3d> c_se3_r(num_cameras, Eigen::Isometry3d::Identity());
55 for (
size_t cam_idx = 1; cam_idx < num_cameras; ++cam_idx) {
56 std::vector<Eigen::Isometry3d> rels;
57 for (
size_t view_idx = 0; view_idx < num_views; ++view_idx) {
58 const auto& obs_ref = views[view_idx][0];
59 const auto& obs_cam = views[view_idx][cam_idx];
60 if (obs_ref.size() < 4 || obs_cam.size() < 4)
continue;
61 rels.push_back(cam_se3_ref[view_idx][cam_idx] * cam_se3_ref[view_idx][0].inverse());
67 std::vector<Eigen::Isometry3d> r_se3_t(num_views, Eigen::Isometry3d::Identity());
68 for (
size_t view_idx = 0; view_idx < num_views; ++view_idx) {
69 std::vector<Eigen::Isometry3d> tposes;
70 for (
size_t cam_idx = 0; cam_idx < num_cameras; ++cam_idx) {
71 if (views[view_idx][cam_idx].size() < 4)
continue;
72 tposes.push_back(c_se3_r[cam_idx].inverse() * cam_se3_ref[view_idx][cam_idx]);