1 #include "../lib/args.h" 2 #include "../lib/opencv.h" 3 #include "../lib/dataset.h" 4 #include "../lib/image_io.h" 5 #include "../lib/viewer.h" 6 #include "../lib/filesystem.h" 15 int main(
int argc,
const char* argv[]) {
16 get_args(argc, argv,
"dataset_parameters.json [refgrid.json] [out_fpoints_dir/] [dataset_group]");
25 std::function<view_index()> get_shown_idx;
27 if(refgrid_filename.empty()) {
28 const auto& slider_x = view.add_int_slider(
"X", datas.
x_mid(), datas.
x_min(), datas.
x_max(), datas.
x_step());
29 auto& slider_y = view.add_int_slider(
"Y", datas.
y_mid(), datas.
y_min(), datas.
y_max(), datas.
y_step());
30 get_shown_idx = [&]() {
35 auto& slider_col = view.add_int_slider(
"r_col", 0, 0, grid.
cols()-1);
36 auto& slider_row = view.add_int_slider(
"r_row", 0, 0, grid.
rows()-1);
37 get_shown_idx = [&]() {
38 return grid.
view(slider_col, slider_row);
44 auto& features_quality_level = view.add_real_slider(
"qual", 0.5, 0.0, 1.0);
45 auto& wanted_features = view.add_int_slider(
"wanted", 100, 1, 300);
46 auto& subdivisions = view.add_int_slider(
"subdiv", 2, 1, 4);
48 auto choose_features = [&](
const cv::Mat_<cv::Vec3b>& orig_img) {
50 cv::cvtColor(orig_img, img, CV_BGR2GRAY);
52 int width = img.cols, height = img.rows;
54 const int pieces_count = subdivisions * subdivisions;
55 auto get_piece_mask = [&](
int piece) {
56 int w = width/subdivisions;
57 int h = height/subdivisions;
58 int x = (piece % subdivisions) * w;
59 int y = (piece / subdivisions) * h;
61 cv::Mat_<uchar> mask(height, width);
63 mask(cv::Rect(x, y, w, h)).setTo(255);
67 std::vector<std::vector<cv::Point2f>> piece_positions(pieces_count);
68 #pragma omp parallel for 69 for(
int piece = 0; piece < pieces_count; ++piece) {
70 cv::Mat_<uchar> piece_mask = get_piece_mask(piece);
76 while(positions.size() < wanted_features) {
77 bool none_left =
true;
78 for(
const std::vector<cv::Point2f>& piece_pos : piece_positions) {
79 if(piece_pos.size() <= i)
continue;
80 positions.push_back(piece_pos[i]);
90 view.update_callback = [&]() {
92 if(! datas.
valid(idx))
return;
97 std::vector<cv::Point2f> features = choose_features(img);
98 for(cv::Point2f pt : features) {
99 cv_aa_circle(img, pt, 7, cv::Scalar(cv::Vec3b(255, 255, 255)), 3);
100 cv_aa_circle(img, pt, 5, cv::Scalar(cv::Vec3b(0, 0, 255)), 2);
103 }
catch(
const std::runtime_error&) {
104 std::cout <<
"could not load " << filename << std::endl;
109 auto unique_feature_name = [](
int number) {
110 return fmt::format(
"feat{:04d}", number);
113 auto export_fpoints = [&](
view_index idx,
int global_index_base = 0) {
117 std::vector<cv::Point2f> features = choose_features(img);
120 for(
const cv::Point2f& pt : features) {
121 std::string feature_name = unique_feature_name(global_index_base + number);
124 fpoint.
position = point2f_to_vec2(pt);
125 fpoints.
points[feature_name] = fpoint;
133 view.key_callback = [&](
int keycode) {
137 std::cout <<
"saving feature points for all reference views" << std::endl;
138 int global_index_base = 0;
139 for(std::ptrdiff_t col = 0; col < grid.
cols(); ++col)
140 for(std::ptrdiff_t row = 0; row < grid.
rows(); ++row) {
141 export_fpoints(grid.
view(col, row), global_index_base);
142 global_index_base += 1000;
146 std::cout <<
"saving feature points for this view" << std::endl;
147 export_fpoints(get_shown_idx());
std::string filename_append(const std::string &a, const std::string &b)
cv::Size image_size_with_border() const
int main(int argc, const char *argv[])
std::vector< vec2 > positions(const feature_points &fpoints)
references_grid decode_references_grid(const json &j_grid)
std::string image_filename() const
std::string encode_view_index(view_index idx)
dataset_view view(int x) const
Points of different features, on one view.
cv::Mat_< cv::Vec3b > load_texture(const std::string &filename)
std::map< std::string, feature_point > points
bool valid(view_index) const
json encode_feature_points(const feature_points &fpoints)
constexpr int enter_keycode
void export_json_file(const json &j, const std::string &filename, bool compact)
view_index view(std::ptrdiff_t col, std::ptrdiff_t row) const
std::string out_dirname_opt_arg(const std::string &def)
constexpr real min_distance_between_features
json import_json_file(const std::string &filename)
std::string in_filename_opt_arg(const std::string &def="")
dataset_group group(const std::string &grp) const
void cv_aa_circle(cv::Mat &mat, const cv::Point2f ¢er, float rad, cv::Scalar col, int thickness)
std::string string_opt_arg(const std::string &def="")
void get_args(int argc, const char *argv[], const std::string &usage)