1 // This is brl/bpro/core/vpgl_pro/processes/vpgl_backproject_dem_process.cxx
2 #include <iostream>
3 #include <bprb/bprb_func_process.h>
4 //:
5 // \file
6 
7 #include <bprb/bprb_parameters.h>
8 #ifdef _MSC_VER
9 #  include "vcl_msvc_warnings.h"
10 #endif
11 #include "vpgl/vpgl_camera.h"
12 #include "vil/vil_image_resource_sptr.h"
13 #include "../vpgl_dem_manager.h"
14 //: initialization
vpgl_backproject_dem_process_cons(bprb_func_process & pro)15 bool vpgl_backproject_dem_process_cons(bprb_func_process& pro)
16 {
17   //this process takes 5 inputs: dem_manager, camera, u, v, error tolerance
18   bool ok=false;
19   std::vector<std::string> input_types;
20   input_types.emplace_back("vpgl_dem_manager_sptr");
21   input_types.emplace_back("vpgl_camera_double_sptr");
22   input_types.emplace_back("double");
23   input_types.emplace_back("double");
24   input_types.emplace_back("double");
25   ok = pro.set_input_types(input_types);
26   if (!ok) return ok;
27 
28   std::vector<std::string> output_types;
29   output_types.emplace_back("double");  // x
30   output_types.emplace_back("double");  // y
31   output_types.emplace_back("double");  // z
32   ok = pro.set_output_types(output_types);
33   if (!ok) return ok;
34 
35   return true;
36 
37 }
38 
39 //: Execute the process
vpgl_backproject_dem_process(bprb_func_process & pro)40 bool vpgl_backproject_dem_process(bprb_func_process& pro)
41 {
42   if (pro.n_inputs()< 5) {
43     std::cout << "vpgl_backproject_dem_process: The input number should be 5" << std::endl;
44     return false;
45   }
46 
47   // get the inputs
48   unsigned i = 0;
49   vpgl_dem_manager_sptr dem_mgr = pro.get_input<vpgl_dem_manager_sptr>(i++);
50   vpgl_camera_double_sptr cam = pro.get_input<vpgl_camera_double_sptr>(i++);
51   auto u = pro.get_input<double>(i++);
52   auto v = pro.get_input<double>(i++);
53   auto err_tol = pro.get_input<double>(i);
54   if(!dem_mgr || !cam){
55    std::cout << "vpgl_backproject_dem_process: Null input dem_mgr or camera" << std::endl;
56     return false;
57   }
58   double x, y, z;
59   // if err_tol = -1, use default
60   bool good = true;
61   std::cout << "[u,v]=[" << u << ',' << v << "], err tol=" << err_tol << std::endl;
62   if(err_tol>0){
63     good = dem_mgr->back_project(cam.ptr(), u, v, x, y, z, err_tol);
64     std::cout << "PX,PY,PZ " << x << ' ' << y << ' ' << z << std::endl;
65   }else {
66     good = dem_mgr->back_project(cam.ptr(), u, v, x, y, z);
67     std::cout << "DPX,DPY,DPZ " << x << ' ' << y << ' ' << z << std::endl;
68   }
69     if(!good){
70     std::cout << "vpgl_backproject_dem_process: backproject onto dem failed" << std::endl;
71     return false;
72   }
73   std::cout << "XYZ " << x << ' ' << y << ' ' << z << std::endl;
74   pro.set_output_val<double>(0, (double)x);
75   pro.set_output_val<double>(1, (double)y);
76   pro.set_output_val<double>(2, (double)z);
77   return true;
78 }
79