1 // This is brl/bseg/sdet/sdet_symbolic_edge_linker.cxx
2 #include <vector>
3 #include <iostream>
4 #include <string>
5 #include "sdet_symbolic_edge_linker.h"
6 //:
7 // \file
8 
9 #include <sdet/sdet_edgemap_sptr.h>
10 #include <sdet/sdet_sel_sptr.h>
11 #include <sdet/sdet_sel.h>
12 #include <sdet/sdet_curve_model.h>
13 
14 #ifdef _MSC_VER
15 #  include "vcl_msvc_warnings.h"
16 #endif
17 #include "vul/vul_timer.h"
18 #include "vil/vil_image_resource.h"
19 
apply(const sdet_edgemap_sptr & edgemap)20 void sdet_symbolic_edge_linker::apply(const sdet_edgemap_sptr& edgemap) {
21 
22   //different types of linkers depending on the curve model
23   typedef sdet_sel<sdet_simple_linear_curve_model> sdet_sel_simple_linear;
24   typedef sdet_sel<sdet_linear_curve_model> sdet_sel_linear;
25   typedef sdet_sel<sdet_CC_curve_model> sdet_sel_CC;
26   typedef sdet_sel<sdet_CC_curve_model_new> sdet_sel_CC_new;
27   typedef sdet_sel<sdet_CC_curve_model_perturbed> sdet_sel_CC_perturbed;
28   typedef sdet_sel<sdet_CC_curve_model_3d> sdet_sel_CC_3d;
29   typedef sdet_sel<sdet_ES_curve_model> sdet_sel_ES;
30   typedef sdet_sel<sdet_ES_curve_model_perturbed> sdet_sel_ES_perturbed;
31 
32   //start the timer
33   vul_timer t;
34 
35   //construct the linker
36   sdet_sel_sptr edge_linker;
37 
38   //The curvelet formation parameters
39   sdet_curvelet_params cvlet_params(sdet_curve_model::CC,
40                                      nrad_, gap_, dt_, dx_, badap_uncer_,
41                                      token_len_, max_k_, max_gamma_,
42                                      bCentered_grouping_,
43                                      bBidirectional_grouping_);
44 
45   switch (curve_model_type_)
46   {
47   case 0: //simple linear_model
48     cvlet_params.C_type = sdet_curve_model::LINEAR;
49     edge_linker = new sdet_sel_simple_linear(edgemap, CM, ELG, CFG, cvlet_params);
50     break;
51   case 1: //linear_model
52     cvlet_params.C_type = sdet_curve_model::LINEAR;
53     edge_linker = new sdet_sel_linear(edgemap, CM, ELG, CFG, cvlet_params);
54     break;
55   case 2: //CC_model
56     cvlet_params.C_type = sdet_curve_model::CC;
57     edge_linker = new sdet_sel_CC(edgemap, CM, ELG, CFG, cvlet_params);
58     break;
59   case 3: //CC_model new
60     cvlet_params.C_type = sdet_curve_model::CC2;
61     edge_linker = new sdet_sel_CC_new(edgemap, CM, ELG, CFG, cvlet_params);
62     break;
63   case 4: //CC_model with discrete perturbations
64     cvlet_params.C_type = sdet_curve_model::CC;
65     edge_linker = new sdet_sel_CC_perturbed(edgemap, CM, ELG, CFG, cvlet_params);
66     break;
67   case 5: //CC_model 3d bundle
68     cvlet_params.C_type = sdet_curve_model::CC3d;
69     edge_linker = new sdet_sel_CC_3d(edgemap, CM, ELG, CFG, cvlet_params);
70     break;
71   case 6: //ES_model
72     cvlet_params.C_type = sdet_curve_model::ES;
73     edge_linker = new sdet_sel_ES(edgemap, CM, ELG, CFG, cvlet_params);
74     break;
75   case 7: //ES_model with discrete perturbations
76     cvlet_params.C_type = sdet_curve_model::ES;
77     edge_linker = new sdet_sel_ES_perturbed(edgemap, CM, ELG, CFG, cvlet_params);
78     break;
79   }
80 
81   //set appearance usage flags
82   edge_linker->set_appearance_usage(app_usage_);
83   edge_linker->set_appearance_threshold(app_thresh_);
84 
85   //perform local edgel grouping
86   switch (grouping_algo_)
87   {
88   case 0: //greedy (depth first grouping)
89     edge_linker->build_curvelets_greedy(max_size_to_group_, false);
90     break;
91   case 1: //extra greedy (depth first grouping)
92     edge_linker->build_curvelets_greedy(max_size_to_group_, true);
93     break;
94   }
95 
96   if (bFormCompleteCvletMap_)
97     edge_linker->form_full_cvlet_map();
98 
99   double group_time = t.real() / 1000.0;
100   t.mark();
101   std::cout << "Time taken to form groups and cunstruct curvelet map: " << group_time << " sec" << std::endl;
102 
103   if (bFormLinkGraph_){
104   //form a link graph
105     if (b_use_all_cvlets_)
106       edge_linker->use_all_curvelets();
107     else
108       edge_linker->use_anchored_curvelets_only();
109 
110     //form the link graph
111     edge_linker->construct_the_link_graph(min_size_to_link_, linkgraph_algo_);
112 
113     //extract contours
114     switch (linking_algo_) {
115       case 1: // iteratively
116         edge_linker->extract_image_contours_from_the_link_graph(num_link_iters_);
117         break;
118       case 2: // regular contours
119         edge_linker->extract_regular_contours_from_the_link_graph();
120         break;
121     }
122   // By Yuliang Guo, Oct, 2010
123     edge_linker->extract_regular_contours_from_the_link_graph();
124 
125     if (bGetfinalcontours_){
126       edge_linker->Construct_Hypothesis_Tree();
127       edge_linker->Disambiguation();
128       edge_linker->correct_CFG_topology();
129       edge_linker->Post_Process();
130     }
131     double link_time = t.real() / 1000.0;
132     std::cout << "Time taken to link: " << link_time << " sec" << std::endl;
133   }
134 }
135