1 #include "bwm_reg_utils.h"
2 #include "vgl/vgl_point_2d.h"
3 #include <vpgl/algo/vpgl_backproject.h>
4 #include <vsol/vsol_digital_curve_2d.h>
5 #include <vsol/vsol_digital_curve_3d.h>
6 #include <vsol/vsol_point_2d.h>
7 #include <vsol/vsol_point_3d.h>
8 
9 // back project a set of edges onto a 3-d plane
10 bool bwm_reg_utils::
back_project_edges(std::vector<vsol_digital_curve_2d_sptr> const & edges_2d,vpgl_rational_camera<double> const & rcam,vgl_plane_3d<double> const & pl,vgl_point_3d<double> const & initial_guess,std::vector<vsol_digital_curve_3d_sptr> & edges_3d)11 back_project_edges(std::vector<vsol_digital_curve_2d_sptr> const& edges_2d,
12                    vpgl_rational_camera<double> const& rcam,
13                    vgl_plane_3d<double> const& pl,
14                    vgl_point_3d<double> const& initial_guess,
15                    std::vector<vsol_digital_curve_3d_sptr>& edges_3d)
16 {
17   edges_3d.clear();
18   for (std::vector<vsol_digital_curve_2d_sptr>::const_iterator eit = edges_2d.begin();
19        eit != edges_2d.end(); ++eit){
20     vsol_digital_curve_3d_sptr dc3d = new vsol_digital_curve_3d;
21     unsigned n = (*eit)->size();
22     for (unsigned i = 0; i<n; ++i)
23     {
24       vsol_point_2d_sptr p = (*eit)->point(i);
25       vgl_point_2d<double> ip = p->get_p();
26       vgl_point_3d<double> p3d;
27       if (!vpgl_backproject::bproj_plane(rcam, ip, pl, initial_guess, p3d))
28          return false;
29       dc3d->add_vertex(new vsol_point_3d(p3d));
30     }
31     edges_3d.push_back(dc3d);
32   }
33   return true;
34 }
35 
36 //forward project edges onto an image plane
37 void bwm_reg_utils::
project_edges(std::vector<vsol_digital_curve_3d_sptr> const & edges_3d,vpgl_rational_camera<double> const & rcam,std::vector<vsol_digital_curve_2d_sptr> & edges_2d)38 project_edges(std::vector<vsol_digital_curve_3d_sptr> const& edges_3d,
39               vpgl_rational_camera<double> const& rcam,
40               std::vector<vsol_digital_curve_2d_sptr>& edges_2d)
41 {
42   edges_2d.clear();
43   for (std::vector<vsol_digital_curve_3d_sptr>::const_iterator eit = edges_3d.begin();
44        eit != edges_3d.end(); ++eit){
45     vsol_digital_curve_2d_sptr dc2d = new vsol_digital_curve_2d;
46     unsigned n = (*eit)->size();
47     for (unsigned i = 0; i<n; ++i)
48     {
49       vsol_point_3d_sptr p = (*eit)->point(i);
50       vgl_point_3d<double> p3d = p->get_p();
51       vgl_point_2d<double> ip = rcam.project(p3d);
52       vsol_point_2d_sptr ipv = new vsol_point_2d(ip);
53       dc2d->add_vertex(ipv);
54     }
55     edges_2d.push_back(dc2d);
56   }
57 }
58