1 //:
2 // \file
3 // \author Vishal Jain
4 // \date 26-Jan-2011
5
6 #include "testlib/testlib_test.h"
7 #include "testlib/testlib_root_dir.h"
8 #include "vgl/vgl_point_3d.h"
9 #include "vpgl/vpgl_perspective_camera.h"
10 #include "vil/vil_image_view.h"
11 #include "vil/vil_save.h"
12
13 #include <boct/boct_bit_tree.h>
14
15 #include <boxm2/boxm2_scene.h>
16 #include <boxm2/boxm2_block.h>
17 #include <boxm2/boxm2_data_base.h>
18 #include <boxm2/boxm2_block_metadata.h>
19 #include <boxm2/io/boxm2_lru_cache.h>
20 #include <boxm2/cpp/algo/boxm2_render_functions.h>
21
22
test_camera()23 vpgl_camera_double_sptr test_camera()
24 {
25 vnl_matrix_fixed<double, 3, 3> mk(0.0);
26 mk[0][0]=990.0; mk[0][2]=4.0;
27 mk[1][1]=990.0; mk[1][2]=4.0; mk[2][2]=8.0/7.0;
28 vpgl_calibration_matrix<double> K(mk);
29 vnl_matrix_fixed<double, 3, 3> mr(0.0);
30 mr[0][0]=1.0; mr[1][1]=-1.0; mr[2][2]=-1.0;
31 vgl_rotation_3d<double> R(mr);
32 vgl_point_3d<double> t(0.5,0.5,100);
33
34 std::cout<<mk<<mr<<t;
35 vpgl_camera_double_sptr cam = new vpgl_perspective_camera<double>(K,t,R);
36 return cam;
37 }
38
39
test_cone_ray_trace()40 void test_cone_ray_trace()
41 {
42 //manufacture scene information
43 boxm2_scene_sptr scene = new boxm2_scene();
44 scene->set_local_origin( vgl_point_3d<double>(0,0,0) );
45
46 //set scene block information
47 std::map<boxm2_block_id, boxm2_block_metadata> blocks;
48 boxm2_block_id id(0,0,0);
49 boxm2_block_metadata data(id,
50 vgl_point_3d<double>(0,0,0),
51 vgl_vector_3d<double>(1.0/8.0, 1.0/8.0, 1.0/8.0),
52 vgl_vector_3d<unsigned>(8,8,1),
53 1, 1, 100,0.0); //Pinit starts out at 0 (will create 0 alphas?
54 blocks[id] = data;
55 scene->set_blocks(blocks);
56
57 //: list of appearance models/observation models used by this scene
58 std::vector<std::string> appearances;
59 appearances.push_back(boxm2_data_traits<BOXM2_MOG3_GREY>::prefix());
60 scene->set_appearances(appearances);
61
62 //grab boxm2_scene_info
63 boxm2_scene_info* info = scene->get_blk_metadata(id);
64
65 //instantiate a cache to grab the first block
66 boxm2_lru_cache::create(scene);
67 boxm2_block* blk = boxm2_cache::instance()->get_block(scene,id);
68 boxm2_data_base * alph = boxm2_cache::instance()->get_data_base(scene,id,boxm2_data_traits<BOXM2_ALPHA>::prefix());
69 boxm2_data_base * mog = boxm2_cache::instance()->get_data_base(scene,id,boxm2_data_traits<BOXM2_MOG3_GREY>::prefix());
70
71 //set block data to be black and white
72 boxm2_data<BOXM2_ALPHA>* alpha_data_ = new boxm2_data<BOXM2_ALPHA>(alph->data_buffer(),alph->buffer_length(),alph->block_id());
73 boxm2_data<BOXM2_MOG3_GREY>* mog3_data_ = new boxm2_data<BOXM2_MOG3_GREY>(mog->data_buffer(),mog->buffer_length(),mog->block_id());
74 typedef vnl_vector_fixed<vxl_byte, 16> uchar16;
75 for (int x=0; x<8; ++x) {
76 for (int y=0; y<4; ++y) {
77 //load current block/tree
78 uchar16 tree = blk->trees()(x,y,0);
79 boct_bit_tree bit_tree( (unsigned char*)tree.data_block(), info->root_level+1);
80 int data_ptr = bit_tree.get_data_ptr();
81
82 alpha_data_->data()[data_ptr] = 1000;
83 mog3_data_->data()[data_ptr] = boxm2_data<BOXM2_MOG3_GREY>::datatype( (vxl_byte) 255);
84 }
85 }
86 for (int x=0; x<8; ++x) {
87 for (int y=4; y<8; ++y) {
88 //load current block/tree
89 uchar16 tree = blk->trees()(x,y,0);
90 boct_bit_tree bit_tree( (unsigned char*)tree.data_block(), info->root_level+1);
91 int data_ptr = bit_tree.get_data_ptr();
92
93 alpha_data_->data()[data_ptr] = 1000;
94 mog3_data_->data()[data_ptr] = boxm2_data<BOXM2_MOG3_GREY>::datatype((vxl_byte) 0);
95 }
96 }
97
98 //change up the valeus
99
100 std::vector<boxm2_data_base*> datas;
101 datas.push_back(alph); datas.push_back(mog);
102
103 //generate test camera
104 vpgl_camera_double_sptr cam = test_camera();
105
106 //create image
107 unsigned ni=8, nj=8;
108 auto* expected = new vil_image_view<float>(ni,nj);
109 expected->fill(0.0f);
110 auto* vis = new vil_image_view<float>(ni,nj);
111 vis->fill(1.0f);
112
113 //run render process
114 boxm2_render_cone_exp_image( info, blk, datas, cam, expected, vis, ni, nj) ;
115 vil_save( *expected, "cone_expected.tiff" );
116
117 //create noncone
118 auto* ray_expected = new vil_image_view<float>(ni,nj);
119 ray_expected->fill(0.0f);
120 auto* ray_vis = new vil_image_view<float>(ni,nj);
121 ray_vis->fill(1.0f);
122 boxm2_render_expected_image( info, blk, datas, cam, ray_expected, ray_vis, ni, nj) ;
123 vil_save( *ray_expected, "ray_expected.tiff" );
124 }
125
126
127 TESTMAIN(test_cone_ray_trace);
128