26 #ifndef MLN_REGISTRATION_REGISTRATION_HH
27 # define MLN_REGISTRATION_REGISTRATION_HH
34 # include <mln/core/image/image3d.hh>
35 # include <mln/core/site_set/box.hh>
36 # include <mln/registration/icp.hh>
37 # include <mln/fun/x2x/all.hh>
38 # include <mln/fun/x2p/closest_point.hh>
39 # include <mln/convert/to_p_array.hh>
42 # include <mln/util/timer.hh>
47 namespace registration
50 using namespace mln::fun::x2x;
90 # ifndef MLN_INCLUDE_ONLY
99 registration_tests(
const p_array<P>& P_,
const p_array<P>& X)
101 mln_assertion(P_.is_valid());
102 mln_assertion(X.is_valid());
103 mln_assertion(!X.is_empty());
104 mln_assertion(!P_.is_empty());
107 mln_precondition(P::dim == 3);
118 template <
typename P>
122 const p_array<P>& P_,
125 trace::entering(
"mln::registration::registration1");
132 registration::closest_point_with_map<P> closest_point(X, domain);
134 std::pair<algebra::quat,mln_vec(P)> pair =
icp(P_, X, closest_point,
135 algebra::quat(1,0,0,0),
138 std::cout <<
"icp = " << t << std::endl;
142 rot_t tqR(pair.first);
144 trans_t tqT(pair.second);
147 trace::exiting(
"mln::registration::registration1");
153 template <
typename P>
157 const p_array<P>& P_,
160 trace::entering(
"mln::registration::registration2");
163 std::string method =
"registration2";
165 registration::closest_point_with_map<P> closest_point(X, domain);
173 p_array<P> P_bak = P_;
176 std::pair<algebra::quat,mln_vec(P)> pair;
177 pair.first = algebra::quat(1,0,0,0);
181 image3d<value::rgb8> out(domain);
183 p_array<P> removed_set;
189 std::cout << std::endl << std::endl <<
"==== New run - " << r << std::endl;
192 pair =
icp(P_bak, X, closest_point,
197 display_sites_used_in_icp(out, P_bak, P_, X, r, method, pair,
202 compute_distance_criteria(P_bak, closest_point, pair, r, d_min, d_max);
204 P_bak = remove_too_far_sites(out, P_bak,
205 closest_point, pair, X, removed_set,
206 r, d_min, d_max, method);
209 display_sites_used_in_icp(out, P_bak, P_, X, r, method, pair,
211 std::cout <<
"==== End of run" << std::endl;
219 std::cout <<
"icp = " << t << std::endl;
220 draw_last_run(domain, P_bak, removed_set, X, pair.first, pair.second);
224 rot_t tqR(pair.first);
226 trans_t tqT(pair.second);
229 trace::exiting(
"mln::registration::registration2");
235 template <
typename P>
239 const p_array<P>& P_,
242 trace::entering(
"mln::registration::registration3");
244 registration::closest_point_with_map<P> closest_point(X, domain);
247 std::string method =
"registration3";
255 p_array<P> P_bak = P_;
258 std::pair<algebra::quat,mln_vec(P)> pair;
259 pair.first = algebra::quat(1,0,0,0);
263 image3d<value::rgb8> out(domain);
265 p_array<P> removed_set;
270 std::cout << std::endl << std::endl <<
"==== New run - "
274 pair =
icp(P_bak, X, closest_point,
279 display_sites_used_in_icp(out, P_bak, P_, X, r, method, pair,
284 compute_distance_criteria(P_bak, closest_point, pair, r, d_min, d_max);
286 P_bak = remove_too_far_sites(out, P_,
287 closest_point, pair, X, removed_set,
288 r, d_min, d_max, method);
291 display_sites_used_in_icp(out, P_bak, P_, X, r, method, pair,
293 std::cout <<
"==== End of run" << std::endl;
301 std::cout <<
"icp = " << t << std::endl;
302 draw_last_run(domain, P_bak, removed_set, X, pair.first, pair.second);
306 rot_t tqR(pair.first);
308 trans_t tqT(pair.second);
311 trace::exiting(
"mln::registration::registration3");
322 template <
typename P>
329 trace::entering(
"registration::registration1");
331 internal::registration_tests(cloud, surface);
334 qk = impl::registration1(domain, cloud, surface);
336 trace::exiting(
"registration::registration1");
342 template <
typename P>
349 trace::entering(
"registration::registration2");
351 internal::registration_tests(cloud, surface);
354 qk = impl::registration2(domain, cloud, surface);
356 trace::exiting(
"registration::registration2");
362 template <
typename P>
369 trace::entering(
"registration::registration3");
371 internal::registration_tests(cloud, surface);
374 qk = impl::registration3(domain, cloud, surface);
376 trace::exiting(
"registration::registration3");
382 # endif // ! MLN_INCLUDE_ONLY
391 #endif // ! MLN_REGISTRATION_REGISTRATION_HH