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