Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Parametrize grid size for keypt_indices_in_cells_ #584

Merged
merged 1 commit into from
Apr 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions example/aist/equirectangular.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,5 @@ GlobalOptimizer:

System:
map_format: "msgpack"
num_grid_cols: 96
num_grid_rows: 48
2 changes: 2 additions & 0 deletions example/aist/fisheye.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,5 @@ Mapping:

System:
map_format: "msgpack"
num_grid_cols: 48
num_grid_rows: 27
2 changes: 2 additions & 0 deletions example/euroc/EuRoC_mono.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ LoopDetector:

System:
map_format: "msgpack"
num_grid_cols: 47
num_grid_rows: 30

PangolinViewer:
keyframe_size: 0.07
Expand Down
2 changes: 2 additions & 0 deletions example/euroc/EuRoC_stereo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ Initializer:

System:
map_format: "msgpack"
num_grid_cols: 47
num_grid_rows: 30

PangolinViewer:
keyframe_size: 0.07
Expand Down
4 changes: 4 additions & 0 deletions example/kitti/KITTI_mono_00-02.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# KITTI monocular model for seq.00-02

System:
num_grid_cols: 40
num_grid_rows: 13

#==============#
# Camera Model #
#==============#
Expand Down
4 changes: 4 additions & 0 deletions example/kitti/KITTI_mono_03.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# KITTI monocular model for seq.03

System:
num_grid_cols: 40
num_grid_rows: 13

#==============#
# Camera Model #
#==============#
Expand Down
4 changes: 4 additions & 0 deletions example/kitti/KITTI_mono_04-12.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# KITTI monocular model for seq.04-12

System:
num_grid_cols: 40
num_grid_rows: 13

#==============#
# Camera Model #
#==============#
Expand Down
4 changes: 4 additions & 0 deletions example/kitti/KITTI_stereo_00-02.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# KITTI stereo model for seq.00-02

System:
num_grid_cols: 40
num_grid_rows: 13

#==============#
# Camera Model #
#==============#
Expand Down
4 changes: 4 additions & 0 deletions example/kitti/KITTI_stereo_03.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# KITTI stereo model for seq.03

System:
num_grid_cols: 40
num_grid_rows: 13

#==============#
# Camera Model #
#==============#
Expand Down
4 changes: 4 additions & 0 deletions example/kitti/KITTI_stereo_04-12.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# KITTI stereo model for seq.04-12

System:
num_grid_cols: 40
num_grid_rows: 13

#==============#
# Camera Model #
#==============#
Expand Down
4 changes: 4 additions & 0 deletions example/tum_vi/TUM_VI_mono.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
# https://vision.in.tum.de/data/datasets/visual-inertial-dataset#geometric_calibration
# pinhole (512x512)

System:
num_grid_cols: 16
num_grid_rows: 16

#==============#
# Camera Model #
#==============#
Expand Down
4 changes: 4 additions & 0 deletions example/tum_vi/TUM_VI_stereo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
# https://vision.in.tum.de/data/datasets/visual-inertial-dataset#geometric_calibration
# pinhole (512x512)

System:
num_grid_cols: 16
num_grid_rows: 16

#==============#
# Camera Model #
#==============#
Expand Down
6 changes: 2 additions & 4 deletions src/stella_vslam/camera/base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,10 @@ namespace camera {

base::base(const std::string& name, const setup_type_t setup_type, const model_type_t model_type, const color_order_t color_order,
const unsigned int cols, const unsigned int rows, const double fps,
const double focal_x_baseline, const double true_baseline, const double depth_thr,
const unsigned int num_grid_cols, const unsigned int num_grid_rows)
const double focal_x_baseline, const double true_baseline, const double depth_thr)
: name_(name), setup_type_(setup_type), model_type_(model_type), color_order_(color_order),
cols_(cols), rows_(rows), fps_(fps),
focal_x_baseline_(focal_x_baseline), true_baseline_(true_baseline), depth_thr_(depth_thr),
num_grid_cols_(num_grid_cols), num_grid_rows_(num_grid_rows) {
focal_x_baseline_(focal_x_baseline), true_baseline_(true_baseline), depth_thr_(depth_thr) {
spdlog::debug("CONSTRUCT: camera::base");
}

Expand Down
13 changes: 1 addition & 12 deletions src/stella_vslam/camera/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ class base {
//! Constructor
base(const std::string& name, const setup_type_t setup_type, const model_type_t model_type, const color_order_t color_order,
const unsigned int cols, const unsigned int rows, const double fps,
const double focal_x_baseline, const double true_baseline, const double depth_thr,
const unsigned int num_grid_cols = 64, const unsigned int num_grid_rows = 48);
const double focal_x_baseline, const double true_baseline, const double depth_thr);

//! Destructor
virtual ~base();
Expand Down Expand Up @@ -120,22 +119,12 @@ class base {
//! if a stereo-triangulated point is farther than this threshold, it is invalid)
const double depth_thr_;

//! number of columns of grid to accelerate reprojection matching
const unsigned int num_grid_cols_;
//! number of rows of grid to accelerate reprojection matching
const unsigned int num_grid_rows_;

//---------------------------
// To be set in derived classes

//! information of image boundary
image_bounds img_bounds_;

//! cell width of grid pattern
double inv_cell_width_ = std::numeric_limits<double>::quiet_NaN();
//! cell height of grid pattern
double inv_cell_height_ = std::numeric_limits<double>::quiet_NaN();

//-------------------------
// To be implemented in derived classes

Expand Down
9 changes: 1 addition & 8 deletions src/stella_vslam/camera/equirectangular.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ equirectangular::equirectangular(const std::string& name, const color_order_t& c
spdlog::debug("CONSTRUCT: camera::equirectangular");

img_bounds_ = compute_image_bounds();

inv_cell_width_ = static_cast<double>(num_grid_cols_) / (img_bounds_.max_x_ - img_bounds_.min_x_);
inv_cell_height_ = static_cast<double>(num_grid_rows_) / (img_bounds_.max_y_ - img_bounds_.min_y_);
}

equirectangular::equirectangular(const YAML::Node& yaml_node)
Expand Down Expand Up @@ -89,9 +86,7 @@ nlohmann::json equirectangular::to_json() const {
{"cols", cols_},
{"rows", rows_},
{"fps", fps_},
{"focal_x_baseline", focal_x_baseline_},
{"num_grid_cols", num_grid_cols_},
{"num_grid_rows", num_grid_rows_}};
{"focal_x_baseline", focal_x_baseline_}};
}

std::ostream& operator<<(std::ostream& os, const equirectangular& params) {
Expand All @@ -103,8 +98,6 @@ std::ostream& operator<<(std::ostream& os, const equirectangular& params) {
os << "- color: " << params.get_color_order_string() << std::endl;
os << "- model: " << params.get_model_type_string() << std::endl;
os << "- focal x baseline: " << params.focal_x_baseline_ << std::endl;
os << "- num grid cols: " << params.num_grid_cols_ << std::endl;
os << "- num grid rows: " << params.num_grid_rows_ << std::endl;
return os;
}

Expand Down
5 changes: 0 additions & 5 deletions src/stella_vslam/camera/fisheye.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ fisheye::fisheye(const std::string& name, const setup_type_t& setup_type, const
eigen_dist_params_ << k1_, k2_, k3_, k4_;

img_bounds_ = compute_image_bounds();

inv_cell_width_ = static_cast<double>(num_grid_cols_) / (img_bounds_.max_x_ - img_bounds_.min_x_);
inv_cell_height_ = static_cast<double>(num_grid_rows_) / (img_bounds_.max_y_ - img_bounds_.min_y_);
}

fisheye::fisheye(const YAML::Node& yaml_node)
Expand Down Expand Up @@ -219,8 +216,6 @@ nlohmann::json fisheye::to_json() const {
{"rows", rows_},
{"fps", fps_},
{"focal_x_baseline", focal_x_baseline_},
{"num_grid_cols", num_grid_cols_},
{"num_grid_rows", num_grid_rows_},
{"fx", fx_},
{"fy", fy_},
{"cx", cx_},
Expand Down
5 changes: 0 additions & 5 deletions src/stella_vslam/camera/perspective.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ perspective::perspective(const std::string& name, const setup_type_t& setup_type
eigen_dist_params_ << k1_, k2_, p1_, p2_, k3_;

img_bounds_ = compute_image_bounds();

inv_cell_width_ = static_cast<double>(num_grid_cols_) / (img_bounds_.max_x_ - img_bounds_.min_x_);
inv_cell_height_ = static_cast<double>(num_grid_rows_) / (img_bounds_.max_y_ - img_bounds_.min_y_);
}

perspective::perspective(const YAML::Node& yaml_node)
Expand Down Expand Up @@ -180,8 +177,6 @@ nlohmann::json perspective::to_json() const {
{"rows", rows_},
{"fps", fps_},
{"focal_x_baseline", focal_x_baseline_},
{"num_grid_cols", num_grid_cols_},
{"num_grid_rows", num_grid_rows_},
{"fx", fx_},
{"fy", fy_},
{"cx", cx_},
Expand Down
5 changes: 0 additions & 5 deletions src/stella_vslam/camera/radial_division.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ radial_division::radial_division(const std::string& name, const setup_type_t& se
eigen_cam_matrix_ << fx_, 0, cx_, 0, fy_, cy_, 0, 0, 1;

img_bounds_ = compute_image_bounds();

inv_cell_width_ = static_cast<double>(num_grid_cols_) / (img_bounds_.max_x_ - img_bounds_.min_x_);
inv_cell_height_ = static_cast<double>(num_grid_rows_) / (img_bounds_.max_y_ - img_bounds_.min_y_);
}

radial_division::radial_division(const YAML::Node& yaml_node)
Expand Down Expand Up @@ -167,8 +164,6 @@ nlohmann::json radial_division::to_json() const {
{"rows", rows_},
{"fps", fps_},
{"focal_x_baseline", focal_x_baseline_},
{"num_grid_cols", num_grid_cols_},
{"num_grid_rows", num_grid_rows_},
{"fx", fx_},
{"fy", fy_},
{"cx", cx_},
Expand Down
43 changes: 28 additions & 15 deletions src/stella_vslam/data/common.cc
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,17 @@ cv::Mat convert_json_to_descriptors(const nlohmann::json& json_descriptors) {
}

void assign_keypoints_to_grid(const camera::base* camera, const std::vector<cv::KeyPoint>& undist_keypts,
std::vector<std::vector<std::vector<unsigned int>>>& keypt_indices_in_cells) {
std::vector<std::vector<std::vector<unsigned int>>>& keypt_indices_in_cells,
unsigned int num_grid_cols, unsigned int num_grid_rows) {
double inv_cell_width = static_cast<double>(num_grid_cols) / (camera->img_bounds_.max_x_ - camera->img_bounds_.min_x_);
double inv_cell_height = static_cast<double>(num_grid_rows) / (camera->img_bounds_.max_y_ - camera->img_bounds_.min_y_);

// Pre-allocate memory
const unsigned int num_keypts = undist_keypts.size();
const unsigned int num_to_reserve = 0.5 * num_keypts / (camera->num_grid_cols_ * camera->num_grid_rows_);
keypt_indices_in_cells.resize(camera->num_grid_cols_);
const unsigned int num_to_reserve = 0.5 * num_keypts / (num_grid_cols * num_grid_rows);
keypt_indices_in_cells.resize(num_grid_cols);
for (auto& keypt_indices_in_row : keypt_indices_in_cells) {
keypt_indices_in_row.resize(camera->num_grid_rows_);
keypt_indices_in_row.resize(num_grid_rows);
for (auto& keypt_indices_in_cell : keypt_indices_in_row) {
keypt_indices_in_cell.reserve(num_to_reserve);
}
Expand All @@ -97,52 +101,61 @@ void assign_keypoints_to_grid(const camera::base* camera, const std::vector<cv::
for (unsigned int idx = 0; idx < num_keypts; ++idx) {
const auto& keypt = undist_keypts.at(idx);
int cell_idx_x, cell_idx_y;
if (get_cell_indices(camera, keypt, cell_idx_x, cell_idx_y)) {
if (get_cell_indices(camera, keypt, num_grid_cols, num_grid_rows, inv_cell_width, inv_cell_height, cell_idx_x, cell_idx_y)) {
keypt_indices_in_cells.at(cell_idx_x).at(cell_idx_y).push_back(idx);
}
}
}

auto assign_keypoints_to_grid(const camera::base* camera, const std::vector<cv::KeyPoint>& undist_keypts)
auto assign_keypoints_to_grid(const camera::base* camera, const std::vector<cv::KeyPoint>& undist_keypts,
unsigned int num_grid_cols, unsigned int num_grid_rows)
-> std::vector<std::vector<std::vector<unsigned int>>> {
std::vector<std::vector<std::vector<unsigned int>>> keypt_indices_in_cells;
assign_keypoints_to_grid(camera, undist_keypts, keypt_indices_in_cells);
assign_keypoints_to_grid(camera, undist_keypts, keypt_indices_in_cells, num_grid_cols, num_grid_rows);
return keypt_indices_in_cells;
}

std::vector<unsigned int> get_keypoints_in_cell(const camera::base* camera, const data::frame_observation& frm_obs,
const float ref_x, const float ref_y, const float margin,
const int min_level, const int max_level) {
return get_keypoints_in_cell(camera, frm_obs.undist_keypts_, frm_obs.keypt_indices_in_cells_, ref_x, ref_y, margin, min_level, max_level);
return get_keypoints_in_cell(camera, frm_obs.undist_keypts_, frm_obs.keypt_indices_in_cells_,
ref_x, ref_y, margin,
frm_obs.num_grid_cols_, frm_obs.num_grid_rows_,
min_level, max_level);
}

std::vector<unsigned int> get_keypoints_in_cell(const camera::base* camera, const std::vector<cv::KeyPoint>& undist_keypts,
const std::vector<std::vector<std::vector<unsigned int>>>& keypt_indices_in_cells,
const float ref_x, const float ref_y, const float margin,
const unsigned int num_grid_cols, const unsigned int num_grid_rows,
const int min_level, const int max_level) {
double inv_cell_width = static_cast<double>(num_grid_cols) / (camera->img_bounds_.max_x_ - camera->img_bounds_.min_x_);
double inv_cell_height = static_cast<double>(num_grid_rows) / (camera->img_bounds_.max_y_ - camera->img_bounds_.min_y_);

std::vector<unsigned int> indices;
indices.reserve(undist_keypts.size());

const int min_cell_idx_x = std::max(0, cvFloor((ref_x - camera->img_bounds_.min_x_ - margin) * camera->inv_cell_width_));
if (static_cast<int>(camera->num_grid_cols_) <= min_cell_idx_x) {
const int min_cell_idx_x = std::max(0, cvFloor((ref_x - camera->img_bounds_.min_x_ - margin) * inv_cell_width));
if (static_cast<int>(num_grid_cols) <= min_cell_idx_x) {
return indices;
}

const int max_cell_idx_x = std::min(static_cast<int>(camera->num_grid_cols_ - 1), cvCeil((ref_x - camera->img_bounds_.min_x_ + margin) * camera->inv_cell_width_));
const int max_cell_idx_x = std::min(static_cast<int>(num_grid_cols - 1), cvCeil((ref_x - camera->img_bounds_.min_x_ + margin) * inv_cell_width));
if (max_cell_idx_x < 0) {
return indices;
}

const int min_cell_idx_y = std::max(0, cvFloor((ref_y - camera->img_bounds_.min_y_ - margin) * camera->inv_cell_height_));
if (static_cast<int>(camera->num_grid_rows_) <= min_cell_idx_y) {
const int min_cell_idx_y = std::max(0, cvFloor((ref_y - camera->img_bounds_.min_y_ - margin) * inv_cell_height));
if (static_cast<int>(num_grid_rows) <= min_cell_idx_y) {
return indices;
}

const int max_cell_idx_y = std::min(static_cast<int>(camera->num_grid_rows_ - 1), cvCeil((ref_y - camera->img_bounds_.min_y_ + margin) * camera->inv_cell_height_));
const int max_cell_idx_y = std::min(static_cast<int>(num_grid_rows - 1), cvCeil((ref_y - camera->img_bounds_.min_y_ + margin) * inv_cell_height));
if (max_cell_idx_y < 0) {
return indices;
}

indices.reserve(undist_keypts.size());

const bool check_min_level = 0 <= min_level;
const bool check_max_level = 0 <= max_level;

Expand Down
20 changes: 13 additions & 7 deletions src/stella_vslam/data/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,17 @@ cv::Mat convert_json_to_descriptors(const nlohmann::json& json_descriptors);
* @param keypt_indices_in_cells
*/
void assign_keypoints_to_grid(const camera::base* camera, const std::vector<cv::KeyPoint>& undist_keypts,
std::vector<std::vector<std::vector<unsigned int>>>& keypt_indices_in_cells);
std::vector<std::vector<std::vector<unsigned int>>>& keypt_indices_in_cells,
unsigned int num_grid_cols, unsigned int num_grid_rows);

/**
* Assign all keypoints to cells to accelerate projection matching
* @param camera
* @param undist_keypts
* @return
*/
auto assign_keypoints_to_grid(const camera::base* camera, const std::vector<cv::KeyPoint>& undist_keypts)
auto assign_keypoints_to_grid(const camera::base* camera, const std::vector<cv::KeyPoint>& undist_keypts,
unsigned int num_grid_cols, unsigned int num_grid_rows)
-> std::vector<std::vector<std::vector<unsigned int>>>;

/**
Expand All @@ -55,11 +57,14 @@ auto assign_keypoints_to_grid(const camera::base* camera, const std::vector<cv::
* @param cell_idx_y
* @return
*/
inline bool get_cell_indices(const camera::base* camera, const cv::KeyPoint& keypt, int& cell_idx_x, int& cell_idx_y) {
cell_idx_x = cvFloor((keypt.pt.x - camera->img_bounds_.min_x_) * camera->inv_cell_width_);
cell_idx_y = cvFloor((keypt.pt.y - camera->img_bounds_.min_y_) * camera->inv_cell_height_);
return (0 <= cell_idx_x && cell_idx_x < static_cast<int>(camera->num_grid_cols_)
&& 0 <= cell_idx_y && cell_idx_y < static_cast<int>(camera->num_grid_rows_));
inline bool get_cell_indices(const camera::base* camera, const cv::KeyPoint& keypt,
const unsigned int num_grid_cols, const unsigned int num_grid_rows,
const double inv_cell_width, const double inv_cell_height,
int& cell_idx_x, int& cell_idx_y) {
cell_idx_x = cvFloor((keypt.pt.x - camera->img_bounds_.min_x_) * inv_cell_width);
cell_idx_y = cvFloor((keypt.pt.y - camera->img_bounds_.min_y_) * inv_cell_height);
return (0 <= cell_idx_x && cell_idx_x < static_cast<int>(num_grid_cols)
&& 0 <= cell_idx_y && cell_idx_y < static_cast<int>(num_grid_rows));
}

/**
Expand All @@ -77,6 +82,7 @@ inline bool get_cell_indices(const camera::base* camera, const cv::KeyPoint& key
std::vector<unsigned int> get_keypoints_in_cell(const camera::base* camera, const std::vector<cv::KeyPoint>& undist_keypts,
const std::vector<std::vector<std::vector<unsigned int>>>& keypt_indices_in_cells,
const float ref_x, const float ref_y, const float margin,
const unsigned int num_grid_cols, const unsigned int num_grid_rows,
const int min_level = -1, const int max_level = -1);
std::vector<unsigned int> get_keypoints_in_cell(const camera::base* camera, const frame_observation& frm_obs,
const float ref_x, const float ref_y, const float margin,
Expand Down
Loading
Loading