1 // This is brl/bseg/boxm2/pro/processes/boxm2_scene_from_box_cams_process.cxx
2 //:
3 // \file
4 // \brief A process for computing scenes from perspective cameras and box
5 //
6 // \author J. L. Mundy
7 // \date May 24, 2011
8
9 #include <bprb/bprb_func_process.h>
10 #include <boxm2/boxm2_scene.h>
11 #include <bpgl/algo/bpgl_camera_from_box.h>
12 #include <boxm2/boxm2_util.h>
13 #include <boxm2/util/boxm2_cams_and_box_to_scene.h>
14 #include <bpgl/bpgl_camera_utils.h>
15 namespace boxm2_scene_from_box_cams_process_globals
16 {
17 constexpr unsigned n_inputs_ = 8;
18 constexpr unsigned n_outputs_ = 0;
19 }
boxm2_scene_from_box_cams_process_cons(bprb_func_process & pro)20 bool boxm2_scene_from_box_cams_process_cons(bprb_func_process& pro)
21 {
22 using namespace boxm2_scene_from_box_cams_process_globals;
23
24 //process takes 1 input, the scene
25 std::vector<std::string> input_types_(n_inputs_);
26 input_types_[0] = "vcl_string" ; //cam_dir
27 input_types_[1] = "float"; //xmin
28 input_types_[2] = "float"; //ymon
29 input_types_[3] = "float"; //zmin
30 input_types_[4] = "float"; //width
31 input_types_[5] = "float"; //height
32 input_types_[6] = "float"; //depth
33 input_types_[7] = "vcl_string"; // model dir
34
35 // process has 1 output:
36 std::vector<std::string> output_types_(n_outputs_);
37
38
39 return pro.set_input_types(input_types_) && pro.set_output_types(output_types_);
40 }
41
boxm2_scene_from_box_cams_process(bprb_func_process & pro)42 bool boxm2_scene_from_box_cams_process(bprb_func_process& pro)
43 {
44 using namespace boxm2_scene_from_box_cams_process_globals;
45
46 if ( pro.n_inputs() < n_inputs_ ){
47 std::cout << pro.name() << ": The input number should be " << n_inputs_<< std::endl;
48 return false;
49 }
50 //get the inputs
51 std::string camdir = pro.get_input<std::string>(0);
52 auto xmin = pro.get_input<float>(1);
53 auto ymin = pro.get_input<float>(2);
54 auto zmin = pro.get_input<float>(3);
55 auto width = pro.get_input<float>(4);
56 auto height = pro.get_input<float>(5);
57 auto depth = pro.get_input<float>(6);
58 std::string modeldir= pro.get_input<std::string>(7);
59 auto lvcs_origin_lat = pro.get_input<double>(8);
60 auto lvcs_origin_lon = pro.get_input<double>(9);
61 auto lvcs_origin_elev = pro.get_input<double>(10);
62
63 // get the scene bounding box
64 vgl_box_3d<double> box(vgl_point_3d<double>(xmin,ymin,zmin),
65 vgl_point_3d<double>(xmin+width,ymin+height,zmin+depth));
66 std::vector<vpgl_perspective_camera<double>* > ptrcams = bpgl_camera_utils::cameras_from_directory(camdir);
67 std::vector<vpgl_perspective_camera<double> > cams;
68 cams.reserve(ptrcams.size());
69 for(auto & ptrcam : ptrcams)
70 cams.push_back( * ptrcam );
71
72 std::vector<std::string> appearance;
73 appearance.emplace_back("boxm2_mog3_grey");
74 appearance.emplace_back("boxm2_num_obs");
75
76 std::string scene_dir =modeldir+ "/model";
77 if (!vul_file::make_directory_path( scene_dir.c_str()))
78 return false;
79 boxm2_scene_sptr uscene = new boxm2_scene(scene_dir, box.min_point());
80 uscene->set_appearances(appearance);
81 uscene->save_scene();
82
83 vpgl_lvcs lvcs(lvcs_origin_lat, lvcs_origin_lon, lvcs_origin_elev, vpgl_lvcs::wgs84, vpgl_lvcs::DEG, vpgl_lvcs::METERS);
84 uscene->set_lvcs(lvcs);
85
86 //build the two scenes
87 boxm2_util_cams_and_box_to_scene(cams, box, *uscene);
88 uscene->set_xml_path(scene_dir+"/uscene.xml");
89 uscene->save_scene();
90 return true;
91 }
92