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