1 //:
2 // \file
3 #include <iostream>
4 #include <limits>
5 #include "testlib/testlib_test.h"
6 #include <bvpl/bvpl_subgrid_iterator.h>
7 #include <bvpl/bvpl_voxel_subgrid.h>
8 #include <bvpl/kernels/bvpl_edge2d_kernel_factory.h>
9 #include <bvpl/functors/bvpl_edge2d_functor.h>
10 #include <bvpl/bvpl_neighb_operator.h>
11 
12 #include "vul/vul_file.h"
13 #include "vnl/vnl_math.h"
14 #ifdef _MSC_VER
15 #  include "vcl_msvc_warnings.h"
16 #endif
17 
save_occupancy_raw(const std::string & filename,bvxm_voxel_grid<float> * grid)18 bool save_occupancy_raw(const std::string& filename, bvxm_voxel_grid<float>* grid)
19 {
20   std::fstream ofs(filename.c_str(),std::ios::binary | std::ios::out);
21   if (!ofs.is_open()) {
22     std::cerr << "error opening file " << filename << " for write!\n";
23     return false;
24   }
25 
26   //get the range of the grid
27   bvxm_voxel_grid<float>::iterator grid_it = grid->begin();
28   float max = -1.0f * std::numeric_limits<float>::infinity();
29   float min = std::numeric_limits<float>::infinity();
30   for (unsigned k=0; grid_it != grid->end(); ++grid_it, ++k) {
31     for (unsigned i=0; i<(*grid_it).nx(); ++i) {
32       for (unsigned j=0; j < (*grid_it).ny(); ++j) {
33         if ((*grid_it)(i,j)> max)
34           max = (*grid_it)(i,j);
35         if ((*grid_it)(i,j)< min)
36           min = (*grid_it)(i,j);
37       }
38     }
39   }
40 
41   std::cout << "max: " << max <<std::endl
42            << "min: " << min <<std::endl;
43 
44   // write header
45 
46   unsigned char data_type = 8; // 0 means unsigned byte, 1 signed byte, 8 float
47 
48   vxl_uint_32 nx = grid->grid_size().x();
49   vxl_uint_32 ny = grid->grid_size().y();
50   vxl_uint_32 nz = grid->grid_size().z();
51 
52   ofs.write(reinterpret_cast<char*>(&data_type),sizeof(data_type));
53   ofs.write(reinterpret_cast<char*>(&nx),sizeof(nx));
54   ofs.write(reinterpret_cast<char*>(&ny),sizeof(ny));
55   ofs.write(reinterpret_cast<char*>(&nz),sizeof(nz));
56 
57   // write data
58   // iterate through slabs and fill in memory array
59   auto *ocp_array = new float[nx*ny*nz];
60 
61   bvxm_voxel_grid<float>::iterator ocp_it = grid->begin();
62   for (unsigned k=0; ocp_it != grid->end(); ++ocp_it, ++k) {
63     std::cout << '.';
64     for (unsigned i=0; i<(*ocp_it).nx(); ++i) {
65       for (unsigned j=0; j < (*ocp_it).ny(); ++j) {
66 
67         ocp_array[i*ny*nz + j*nz + k] = (float)((*ocp_it)(i,j) );
68       }
69     }
70   }
71   std::cout << std::endl;
72   ofs.write(reinterpret_cast<char*>(ocp_array),sizeof(float)*nx*ny*nz);
73 
74   ofs.close();
75 
76   delete[] ocp_array;
77 
78   return true;
79 }
80 
vertical_grid(bvxm_voxel_grid<float> * grid,unsigned grid_x,unsigned grid_y)81 void vertical_grid(bvxm_voxel_grid<float>* grid, unsigned grid_x, unsigned grid_y)
82 {
83   // fill with test data
84   float init_val = 0.9f;
85   grid->initialize_data(init_val);
86 
87   // read in each slice, check that init_val was set, and fill with new value
88   std::cout << "read/write: ";
89   bvxm_voxel_slab_iterator<float> slab_it;
90   for (slab_it = grid->begin(); slab_it != grid->end(); ++slab_it) {
91     std::cout << '.';
92     bvxm_voxel_slab<float> vit=*slab_it;
93     for (unsigned i=0; i<grid_x/2; i++) {
94       for (unsigned j=0; j<grid_y; j++) {
95         float &v = vit(i,j);
96         v = 0.1f;
97       }
98     }
99   }
100 }
101 
horizontal_grid(bvxm_voxel_grid<float> * grid,unsigned grid_x,unsigned grid_y)102 void horizontal_grid(bvxm_voxel_grid<float>* grid, unsigned grid_x, unsigned grid_y)
103 {
104   // fill with test data
105   float init_val = 0.9f;
106   grid->initialize_data(init_val);
107 
108   // read in each slice, check that init_val was set, and fill with new value
109   std::cout << "read/write: ";
110   bvxm_voxel_slab_iterator<float> slab_it;
111   for (slab_it = grid->begin(); slab_it != grid->end(); ++slab_it) {
112     std::cout << '.';
113     bvxm_voxel_slab<float> vit=*slab_it;
114     for (unsigned i=0; i<grid_y/2; i++) {
115       for (unsigned j=0; j<grid_x; j++) {
116         float &v = vit(j,i);
117         v = 0.1f;
118       }
119     }
120   }
121 }
122 
diagonal_grid(bvxm_voxel_grid<float> * grid,unsigned grid_x,unsigned grid_y)123 void diagonal_grid(bvxm_voxel_grid<float>* grid, unsigned grid_x, unsigned grid_y)
124 {
125   // fill with test data
126   float init_val = 0.9f;
127   grid->initialize_data(init_val);
128 
129   // read in each slice, check that init_val was set, and fill with new value
130   std::cout << "read/write: ";
131   bvxm_voxel_slab_iterator<float> slab_it;
132   for (slab_it = grid->begin(); slab_it != grid->end(); ++slab_it) {
133     std::cout << '.';
134     unsigned x = grid_x;
135     bvxm_voxel_slab<float> vit=*slab_it;
136     for (unsigned i=0; i<grid_y; i++) {
137       for (unsigned j=0; j<x; j++) {
138         float &v = vit(j,i);
139         v = 0.1f;
140       }
141       x--;
142     }
143   }
144 }
145 
diagonal_grid_z(bvxm_voxel_grid<float> * grid,unsigned grid_x,unsigned grid_y)146 void diagonal_grid_z(bvxm_voxel_grid<float>* grid, unsigned grid_x, unsigned grid_y)
147 {
148   // fill with test data
149   float init_val = 0.9f;
150   grid->initialize_data(init_val);
151 
152   // read in each slice, check that init_val was set, and fill with new value
153   std::cout << "read/write: ";
154   bvxm_voxel_slab_iterator<float> slab_it;
155   unsigned x = 0;
156   for (slab_it = grid->begin(); slab_it != grid->end() ; ++slab_it) {
157     std::cout << '.';
158     bvxm_voxel_slab<float> vit=*slab_it;
159     for (unsigned i=0; i<x && i<grid_x; i++) {
160       for (unsigned j=0; j<grid_y; j++) {
161         float &v = vit(i,j);
162         v = 0.1f;
163       }
164     }
165     x++;
166   }
167 }
168 
169 //: Test changes
test_neighb_oper()170 static void test_neighb_oper()
171 {
172   // create the grid
173   // we need temporary disk storage for this test.
174   std::string storage_fname("bvxm_voxel_grid_test_temp1a.vox");
175   std::string storage_fname2("bvxm_voxel_grid_test_temp1b.vox");
176   // remove file if exists from previous test.
177   if (vul_file::exists(storage_fname.c_str())) {
178     vul_file::delete_file_glob(storage_fname.c_str());
179   }
180   if (vul_file::exists(storage_fname2.c_str())) {
181     vul_file::delete_file_glob(storage_fname2.c_str());
182   }
183 #if 0
184   if (vul_file::exists(storage_cached_fname.c_str())) {
185     vul_file::delete_file_glob(storage_cached_fname.c_str());
186   }
187 #endif
188 
189   unsigned int grid_x=50, grid_y=50, grid_z=50;
190 
191   vgl_vector_3d<unsigned> grid_size(grid_x, grid_y, grid_z);
192   //unsigned max_cache_size = grid_size.x()*grid_size.y()*18;
193 
194   // try test with all types of underlying storage.
195   bvxm_voxel_grid<float>* grid = new bvxm_voxel_grid<float>(storage_fname,grid_size); // disk storage;
196   bvxm_voxel_grid<float>* grid_out = new bvxm_voxel_grid<float>(storage_fname2,grid_size);
197   grid_out->initialize_data(0.0e-40);
198   std::string test_name;
199 
200   // check num_observations
201   unsigned nobs = grid->num_observations();
202   std::cout << "num_observations = " << nobs << std::endl;
203 
204   diagonal_grid_z(grid, grid_x, grid_y);
205 
206   std::cout << "done." << std::endl;
207   save_occupancy_raw("first.raw", grid);
208 
209   bvpl_edge2d_kernel_factory edge_factory(5, 5);
210 
211   edge_factory.set_rotation_axis(vnl_float_3(1,0,1));
212   edge_factory.set_angle(float(vnl_math::pi)); // was float(3*vnl_math::pi_over_4)
213 
214   bvpl_kernel_sptr kernel_sptr = new bvpl_kernel(edge_factory.create());
215   kernel_sptr->print();
216   bvpl_edge2d_functor<float> func;
217   bvpl_neighb_operator<float, bvpl_edge2d_functor<float> > oper(func);
218   oper.operate(grid, kernel_sptr, grid_out);
219   save_occupancy_raw("out.raw", grid_out);
220 }
221 
222 TESTMAIN( test_neighb_oper );
223