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