1 #ifndef boxm2_compute_normal_albedo_functor_h_
2 #define boxm2_compute_normal_albedo_functor_h_
3 //:
4 // \file
5 
6 #include <iostream>
7 #include <vector>
8 #include <boxm2/boxm2_data_traits.h>
9 #include <boxm2/boxm2_data_base.h>
10 #include <boxm2/boxm2_data.h>
11 #include <boxm2/basic/boxm2_block_id.h>
12 #include <boxm2/io/boxm2_stream_cache.h>
13 #ifdef _MSC_VER
14 #  include <vcl_msvc_warnings.h>
15 #endif
16 
17 #include <brad/brad_image_metadata.h>
18 #include <brad/brad_atmospheric_parameters.h>
19 
20 class boxm2_compute_normal_albedo_functor
21 {
22  public:
23   typedef boxm2_data_traits<BOXM2_NORMAL_ALBEDO_ARRAY>::datatype naa_datatype;
24   typedef boxm2_data_traits<BOXM2_ALPHA>::datatype alpha_datatype;
25   typedef boxm2_data_traits<BOXM2_AUX0>::datatype aux0_datatype;
26   typedef boxm2_data_traits<BOXM2_AUX1>::datatype aux1_datatype;
27   typedef boxm2_data_traits<BOXM2_AUX2>::datatype aux2_datatype;
28   typedef boxm2_data_traits<BOXM2_AUX3>::datatype aux3_datatype;
29 
30   //: standard constructor
boxm2_compute_normal_albedo_functor(bool update_alpha)31   boxm2_compute_normal_albedo_functor(bool update_alpha)  : update_alpha_(update_alpha) {}
32 
33   bool init_data(std::vector<brad_image_metadata> const& metadata,
34                  std::vector<brad_atmospheric_parameters> const& atm_params,
35                  const boxm2_stream_cache_sptr& str_cache,
36                  boxm2_data_base * alpha_data,
37                  boxm2_data_base * normal_albedo_model);
38 
39   bool process_cell(unsigned int index, bool is_leaf = false, float side_len = 0.0);
40 
41  private:
42   boxm2_data<BOXM2_NORMAL_ALBEDO_ARRAY>* naa_model_data_;
43   boxm2_data<BOXM2_ALPHA>* alpha_data_;
44 
45   boxm2_stream_cache_sptr str_cache_;
46   boxm2_block_id id_;
47   std::vector<brad_image_metadata> metadata_;
48   std::vector<brad_atmospheric_parameters> atm_params_;
49 
50   unsigned int num_normals_;
51   unsigned int num_images_;
52   bool update_alpha_;
53 
54   // cache sun positions
55   std::vector<vgl_vector_3d<double> > sun_positions_;
56   // cache normal directions
57   std::vector<vgl_vector_3d<double> > normals_;
58 
59   // cache scale and offset values for reflectance, expected radiance, and expected radiance variance
60   // reflectance = scale * radiance + offset
61   std::vector<std::vector<double> > reflectance_scales_;
62   std::vector<std::vector<double> > reflectance_offsets_;
63   // expected radiance = scale * reflectance + offset
64   std::vector<std::vector<double> > radiance_scales_;
65   std::vector<std::vector<double> > radiance_offsets_;
66   // radiance variance = scale*reflectance*reflectance + offset
67   std::vector<std::vector<double> > radiance_var_scales_;
68   std::vector<std::vector<double> > radiance_var_offsets_;
69 
70 };
71 
72 #endif // boxm2_compute_normal_albedo_functor_h_
73