1 // This is brl/bseg/betr/pro/processes/betr_set_event_trigger_data_multi_ref_process.cxx
2 //:
3 // \file
4 // \brief  A process for seting an event_trigger data to an event_trigger from paths
5 //
6 
7 #include <iostream>
8 #include <fstream>
9 #include <string>
10 #include <bprb/bprb_func_process.h>
11 #ifdef _MSC_VER
12 #  include "vcl_msvc_warnings.h"
13 #endif
14 #include "vil/vil_load.h"
15 #include "vpgl/vpgl_rational_camera.h"
16 #include <core/bbas_pro/bbas_1d_array_string.h>
17 #include "vpgl/vpgl_local_rational_camera.h"
18 #include "vpgl/vpgl_lvcs.h"
19 
20 #include <betr/betr_event_trigger.h>
21 #include "vpgl/vpgl_camera_double_sptr.h"
22 #include "vpgl/vpgl_camera.h"
23 
24 
25 namespace betr_set_event_trigger_data_multi_ref_process_globals
26 {
27   constexpr unsigned n_inputs_ = 5;
28   constexpr unsigned n_outputs_ = 0;
29 }
30 
betr_set_event_trigger_data_multi_ref_process_cons(bprb_func_process & pro)31 bool betr_set_event_trigger_data_multi_ref_process_cons(bprb_func_process& pro)
32 {
33   using namespace betr_set_event_trigger_data_multi_ref_process_globals;
34 
35   //process takes 5 inputs
36   std::vector<std::string> input_types_(n_inputs_);
37   input_types_[0] = "betr_event_trigger_sptr";// event_trigger
38   input_types_[1] = "bbas_1d_array_string_sptr";// reference image paths
39   input_types_[2] = "bbas_1d_array_string_sptr";// reference camera paths
40   input_types_[3] = "vcl_string";// event image path
41   input_types_[4] = "vcl_string";// event camera path
42   // process has 0 outputs
43   std::vector<std::string> output_types_(n_outputs_);
44   return pro.set_input_types(input_types_) && pro.set_output_types(output_types_);
45 }
46 
betr_set_event_trigger_data_multi_ref_process(bprb_func_process & pro)47 bool betr_set_event_trigger_data_multi_ref_process(bprb_func_process& pro)
48 {
49   using namespace betr_set_event_trigger_data_multi_ref_process_globals;
50 
51   if ( pro.n_inputs() < n_inputs_ ) {
52     std::cout << pro.name() << ": The input number should be " << n_inputs_<< std::endl;
53     return false;
54   }
55   //get the inputs
56   unsigned i = 0;
57   betr_event_trigger_sptr event_trigger = pro.get_input<betr_event_trigger_sptr>(i++);
58   bbas_1d_array_string_sptr ref_img_paths = pro.get_input<bbas_1d_array_string_sptr>(i++);
59   // Assumed to be a global rational camera, projecting lon, lat, elv to (u,v)
60   bbas_1d_array_string_sptr ref_cam_paths = pro.get_input<bbas_1d_array_string_sptr>(i++);
61   std::string evt_img_path = pro.get_input<std::string>(i++);
62   // Assumed to be a global rational camera, projecting lon, lat, elv to (u,v)
63   std::string evt_cam_path = pro.get_input<std::string>(i);
64   unsigned nimg = (ref_img_paths->data_array).size();
65   unsigned ncam = (ref_cam_paths->data_array).size();
66   if(!event_trigger||!nimg || !ncam || evt_img_path=="" || evt_cam_path==""){
67     std::cout << " null input data " << std::endl;
68     return false;
69   }
70   if(nimg != ncam){
71     std::cout << " reference image and reference camera array sizes don't match" << std::endl;
72     return false;
73   }
74   // load the reference images
75   std::vector<vil_image_resource_sptr> ref_rescs;
76   for(unsigned i = 0; i<nimg; i++){
77     std::string img_path = (ref_img_paths->data_array)[i];
78     vil_image_resource_sptr resc = vil_load_image_resource(img_path.c_str());
79     if(!resc){
80       std::cout << "Invalid reference image  path " << img_path << std::endl;
81       return false;
82     }
83     ref_rescs.push_back(resc);
84   }
85   std::vector<vpgl_camera_double_sptr> ref_cams;
86   for(unsigned i = 0; i<ncam; i++){
87     std::string cam_path = (ref_cam_paths->data_array)[i];
88     vpgl_rational_camera<double>* rcam_ptr = read_rational_camera_from_txt<double>(cam_path);
89     if(!rcam_ptr){
90       std::cout << "can't read reference camera from txt file " << cam_path << std::endl;
91       return false;
92     }
93     vpgl_local_rational_camera<double>* lcam = new vpgl_local_rational_camera<double>(event_trigger->lvcs(),*rcam_ptr);
94     vpgl_camera_double_sptr ref_lcam = dynamic_cast<vpgl_camera<double>*>(lcam);
95     ref_cams.push_back(ref_lcam);
96     delete rcam_ptr;
97   }
98   //load event image resource
99   vil_image_resource_sptr evt_resc = vil_load_image_resource(evt_img_path.c_str());
100   if(!evt_resc){
101     std::cout << "Invalid event image path " << evt_img_path << std::endl;
102     return false;
103   }
104   //load event camera
105   vpgl_rational_camera<double>* ecam_ptr = read_rational_camera_from_txt<double>(evt_cam_path);
106   if(!ecam_ptr){
107     std::cout << "can't read event camera from txt file " << evt_cam_path << std::endl;
108     return false;
109   }
110   vpgl_local_rational_camera<double>* elcam = new vpgl_local_rational_camera<double>(event_trigger->lvcs(),*ecam_ptr);
111   vpgl_camera_double_sptr evt_lcam = dynamic_cast<vpgl_camera<double>*>(elcam);
112   if(!evt_lcam)
113     return false;
114   delete ecam_ptr;
115   event_trigger->set_ref_images(ref_rescs);
116   event_trigger->set_ref_cameras(ref_cams);
117   event_trigger->set_evt_image(evt_resc);
118   event_trigger->set_evt_camera(evt_lcam);
119   return true;
120 }
121