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