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