DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
testSegmentation.cpp
1 
16 //LICENSE-END
34 #include <cstdio>
35 #include <cmath>
36 #include <fstream>
37 #include <vector>
38 #include <iostream>
39 #include <iterator>
40 
41 
42 
43 
44 #include "DGtal/base/Common.h"
45 #include "DGtal/base/Exceptions.h"
46 
47 #include "DGtal/io/boards/Board2D.h"
48 #include "DGtal/io/Color.h"
49 
50 #include "DGtal/base/Circulator.h"
51 
52 #include "DGtal/geometry/curves/ArithmeticalDSS.h"
53 #include "DGtal/geometry/curves/FreemanChain.h"
54 #include "DGtal/geometry/curves/GreedySegmentation.h"
55 #include "DGtal/geometry/curves/SaturatedSegmentation.h"
56 
57 
58 #include "ConfigTest.h"
59 
60 
61 using namespace DGtal;
62 using namespace std;
63 using namespace LibBoard;
64 
66 // Functions for testing class GreedySegmentation
68 
69 
70 
74 template <typename Iterator, typename Board>
75 void draw(const Iterator& itb, const Iterator& ite, Board& aBoard)
76 {
77 
78  for (Iterator i(itb); i != ite; ++i) {
79 
80  typename Iterator::SegmentComputer segment(*i);
81 
82  aBoard << SetMode(segment.className(), "BoundingBox" )
83  << segment; // draw bounding box
84 
85  }
86 
87 }
88 
92 template <typename Iterator, typename Board>
93 void drawCCP(const Iterator& itb, const Iterator& ite, Board& aBoard)
94 {
95 
96  typedef typename Iterator::SegmentComputer::ConstIterator PointIterator;
97 
98  aBoard << SetMode( "ArithmeticalDSS", "BoundingBox" );
99  string aStyleName = "ArithmeticalDSS/BoundingBox";
100 
101  for (Iterator i(itb); i != ite; ++i) {
102 
103  //choose pen color
104  CustomPenColor* aPenColor;
105 
106  if ( !(i.intersectNext() && i.intersectPrevious()) ) {
107 
108  aPenColor = new CustomPenColor( Color::Black );
109 
110  } else {
111 
112  //end points
113 
114  PointIterator begin = i->begin(); --begin;
115  PointIterator end = i->end();
116 
117  //parameters
118  int mu = i->getMu();
119  int omega = i->getOmega();
120 
121  //configurations
122  if ( (i->getRemainder(begin)<=mu-1)&&
123  (i->getRemainder(end)<=mu-1) ) { //concave
124  aPenColor = new CustomPenColor( Color::Green);
125  } else if ( (i->getRemainder(begin)>=mu+omega)&&
126  (i->getRemainder(end)>=mu+omega) ) { //convex
127  aPenColor = new CustomPenColor( Color::Blue );
128  } else if ( (i->getRemainder(begin)>=mu+omega)&&
129  (i->getRemainder(end)<=mu-1) ) { //convex to concave
130  aPenColor = new CustomPenColor( Color::Yellow );
131  } else if ( (i->getRemainder(begin)<=mu-1)&&
132  (i->getRemainder(end)>=mu+omega) ) { //concave to convex
133  aPenColor = new CustomPenColor( Color::Yellow );
134  } else { //pb
135  aPenColor = new CustomPenColor( Color::Red );
136  }
137 
138  }
139 
140  // draw each segment
141  aBoard << CustomStyle( aStyleName, aPenColor )
142  << *i;
143 
144  }
145 
146 }
147 
151 template <typename Iterator, typename Board>
152 void segmentationIntoDSSs(const Iterator& itb, const Iterator& ite,
153  const Iterator& sitb, const Iterator& site,
154  const string& aMode, Board& aBoard)
155 {
156  typedef typename IteratorCirculatorTraits<Iterator>::Value::Coordinate Coordinate;
157  typedef ArithmeticalDSS<Iterator,Coordinate,4> RecognitionAlgorithm;
158  typedef GreedySegmentation<RecognitionAlgorithm> Segmentation;
159 
160  RecognitionAlgorithm algo;
161  Segmentation s(itb,ite,algo);
162  s.setSubRange(sitb,site);
163  s.setMode(aMode);
164 
165  typename Segmentation::SegmentComputerIterator i = s.begin();
166  typename Segmentation::SegmentComputerIterator end = s.end();
167 
168  draw<typename Segmentation::SegmentComputerIterator, Board>
169  (i,end,aBoard);
170 
171 }
172 
176 template <typename Iterator, typename Board>
177 void segmentationIntoMaximalDSSs(const Iterator& itb, const Iterator& ite,
178  const Iterator& sitb, const Iterator& site,
179  const string& aMode, Board& aBoard)
180 {
181  typedef typename IteratorCirculatorTraits<Iterator>::Value::Coordinate Coordinate;
182  typedef ArithmeticalDSS<Iterator,Coordinate,4> RecognitionAlgorithm;
183  typedef SaturatedSegmentation<RecognitionAlgorithm> Segmentation;
184 
185  RecognitionAlgorithm algo;
186  Segmentation s(itb,ite,algo);
187  s.setSubRange(sitb,site);
188  s.setMode(aMode);
189 
190  typename Segmentation::SegmentComputerIterator i = s.begin();
191  typename Segmentation::SegmentComputerIterator end = s.end();
192 
193  drawCCP<typename Segmentation::SegmentComputerIterator, Board>
194  (i,end,aBoard);
195 
196 }
197 
198 
202 bool greedySegmentationVisualTest()
203 {
204 
205  typedef int Coordinate;
206  typedef FreemanChain<Coordinate> FC;
207  typedef FreemanChain<Coordinate>::ConstIterator ConstIterator;
208 
209 
210 
211  std::string filename = testPath + "samples/manche.fc";
212 
213  std::fstream fst;
214  fst.open (filename.c_str(), std::ios::in);
215  FC fc(fst);
216 
218 // open digital curve
219 
220  trace.beginBlock("Segmentation of a whole range (mode1)");
221 {
222  Board2D aBoard;
223  aBoard << SetMode("PointVector", "Grid") << fc;
224 
225  segmentationIntoDSSs<ConstIterator,Board2D>
226  (fc.begin(),fc.end(),
227  fc.begin(),fc.end(),
228  "Truncate",aBoard);
229 
230  aBoard.saveEPS("WholeOpenCurveWithItMode1.eps");
231 }
232  trace.endBlock();
233 
234 
235  trace.beginBlock("Segmentation of a whole range (mode3)");
236 {
237  Board2D aBoard;
238  aBoard << SetMode("PointVector", "Grid") << fc;
239 
240  segmentationIntoDSSs<ConstIterator,Board2D>
241  (fc.begin(),fc.end(),
242  fc.begin(),fc.end(),
243  "DoNotTruncate",aBoard);
244 
245  aBoard.saveEPS("WholeOpenCurveWithItMode3.eps");
246 }
247  trace.endBlock();
248 
249  trace.beginBlock("Segmentation of a whole range (mode2)");
250 {
251  Board2D aBoard;
252  aBoard << SetMode("PointVector", "Grid") << fc;
253 
254  segmentationIntoDSSs<ConstIterator,Board2D>
255  (fc.begin(),fc.end(),
256  fc.begin(),fc.end(),
257  "Truncate+1",aBoard);
258 
259  aBoard.saveEPS("WholeOpenCurveWithItMode2.eps");
260 }
261  trace.endBlock();
262 
263 
265 // subrange
266 
267  typedef vector<PointVector<2,Coordinate> > Curve;
268  typedef Curve::const_iterator RAConstIterator;
269 
270  Curve vPts;
271  vPts.assign ( fc.begin(), fc.end() );
272 
273  RAConstIterator start = vPts.begin()+15;
274  RAConstIterator stop = vPts.begin()+200;
275 
276 trace.info() << *start << " " << *stop << endl;
277 
278  trace.beginBlock("Segmentation of a subrange (mode1)");
279 {
280  Board2D aBoard;
281  aBoard << SetMode("PointVector", "Grid") << fc;
282  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
283 
284  segmentationIntoDSSs<RAConstIterator,Board2D>
285  (vPts.begin(),vPts.end(),
286  start,stop,
287  "Truncate",aBoard);
288 
289  aBoard.saveEPS("PartOpenCurveWithItMode1.eps");
290 }
291  trace.endBlock();
292 
293  trace.beginBlock("Segmentation of a subrange (mode2)");
294 {
295  Board2D aBoard;
296  aBoard << SetMode("PointVector", "Grid") << fc;
297  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
298 
299  segmentationIntoDSSs<RAConstIterator,Board2D>
300  (vPts.begin(),vPts.end(),
301  start,stop,
302  "Truncate+1",aBoard);
303 
304  aBoard.saveEPS("PartOpenCurveWithItMode2.eps");
305 }
306  trace.endBlock();
307 
308 
309  trace.beginBlock("Segmentation of a subrange (mode3)");
310 {
311  Board2D aBoard;
312  aBoard << SetMode("PointVector", "Grid") << fc;
313  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
314 
315  segmentationIntoDSSs<RAConstIterator,Board2D>
316  (vPts.begin(),vPts.end(),
317  start,stop,
318  "DoNotTruncate",aBoard);
319 
320  aBoard.saveEPS("PartOpenCurveWithItMode3.eps");
321 }
322  trace.endBlock();
323 
324 
326 // using circulators
327 
328  typedef Circulator<RAConstIterator> ConstCirculator;
329  ConstCirculator c(vPts.begin(),vPts.begin(),vPts.end());
330 
331  trace.beginBlock("Segmentation of a whole range (mode1) with circulators");
332 {
333  Board2D aBoard;
334  aBoard << SetMode("PointVector", "Grid") << fc;
335 
336  segmentationIntoDSSs<ConstCirculator,Board2D>
337  (c,c,c,c,
338  "Truncate",aBoard);
339 
340  aBoard.saveEPS("WholeOpenCurveWithCircMode1.eps");
341 }
342  trace.endBlock();
343 
344  trace.beginBlock("Segmentation of a whole range (mode2) with circulators");
345 {
346  Board2D aBoard;
347  aBoard << SetMode("PointVector", "Grid") << fc;
348 
349  segmentationIntoDSSs<ConstCirculator,Board2D>
350  (c,c,c,c,
351  "Truncate+1",aBoard);
352 
353  aBoard.saveEPS("WholeOpenCurveWithCircMode2.eps");
354 }
355  trace.endBlock();
356 
357 
358  trace.beginBlock("Segmentation of a whole range (mode3) with circulators");
359 {
360  Board2D aBoard;
361  aBoard << SetMode("PointVector", "Grid") << fc;
362 
363  segmentationIntoDSSs<ConstCirculator,Board2D>
364  (c,c,c,c,
365  "DoNotTruncate",aBoard);
366 
367  aBoard.saveEPS("WholeOpenCurveWithCircMode3.eps");
368 }
369  trace.endBlock();
370 
372 // subrange with circulators
373 
374  ConstCirculator cstart(start,vPts.begin(),vPts.end());
375  ConstCirculator cstop(stop,vPts.begin(),vPts.end());
376 
377  trace.beginBlock("Segmentation of a subrange (mode1) with circulators");
378 {
379  Board2D aBoard;
380  aBoard << SetMode("PointVector", "Grid") << fc;
381  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
382 
383  segmentationIntoDSSs<ConstCirculator,Board2D>
384  (c,c,
385  cstart,cstop,
386  "Truncate",aBoard);
387 
388  aBoard.saveEPS("PartOpenCurveWithCircMode1.eps");
389 }
390  trace.endBlock();
391 
392  trace.beginBlock("Segmentation of a subrange (mode2) with circulators");
393 {
394  Board2D aBoard;
395  aBoard << SetMode("PointVector", "Grid") << fc;
396  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
397 
398  segmentationIntoDSSs<ConstCirculator,Board2D>
399  (c,c,
400  cstart,cstop,
401  "Truncate+1",aBoard);
402 
403  aBoard.saveEPS("PartOpenCurveWithCircMode2.eps");
404 }
405  trace.endBlock();
406 
407 
408  trace.beginBlock("Segmentation of a subrange (mode3) with circulators");
409 {
410  Board2D aBoard;
411  aBoard << SetMode("PointVector", "Grid") << fc;
412  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
413 
414  segmentationIntoDSSs<ConstCirculator,Board2D>
415  (c,c,
416  cstart,cstop,
417  "DoNotTruncate",aBoard);
418 
419  aBoard.saveEPS("PartOpenCurveWithCircMode3.eps");
420 }
421  trace.endBlock();
422 
424 // closed digital curve
425 
426  std::stringstream ss(stringstream::in | stringstream::out);
427  ss << "31 16 1112121212121221212121221212212222232232323332333333332333332330333033003030000010001001001000100010101010111" << endl;
428 
429  // Construct the Freeman chain
430  FC fc2(ss);
431 
432  Curve vPts2;
433  vPts2.assign( fc2.begin(), fc2.end() );
434  vPts2.insert( vPts2.end(), fc2.begin(), fc2.end() );
435  vPts2.insert( vPts2.end(), fc2.begin(), fc2.end() );
436 
437 //copy ( vPts2.begin(), vPts2.end(), ostream_iterator<PointVector<2,Coordinate> >(cout,"\n") ) ;
438 
439  RAConstIterator start2 = vPts2.begin() + fc2.size()+1;
440  RAConstIterator stop2 = start2 + fc2.size()+1;
441 
442 trace.info() << *start2 << " " << *stop2 << endl;
443 
444  trace.beginBlock("Segmentation of a subrange of a duplicated range (mode1)");
445 {
446  Board2D aBoard;
447  aBoard << SetMode("PointVector", "Grid") << fc2;
448  aBoard << SetMode("PointVector", "Paving") << *start2 << *stop2;
449 
450  segmentationIntoDSSs<RAConstIterator,Board2D>
451  (vPts2.begin(),vPts2.end(),
452  start2,stop2,
453  "Truncate",aBoard);
454 
455  aBoard.saveEPS("DuplicatedCurveWithItMode1.eps");
456 }
457  trace.endBlock();
458 
459  trace.beginBlock("Segmentation of a subrange of a duplicated range (mode2)");
460 {
461  Board2D aBoard;
462  aBoard << SetMode("PointVector", "Grid") << fc2;
463  aBoard << SetMode("PointVector", "Paving") << *start2 << *stop2;
464 
465  segmentationIntoDSSs<RAConstIterator,Board2D>
466  (vPts2.begin(),vPts2.end(),
467  start2,stop2,
468  "Truncate+1",aBoard);
469 
470  aBoard.saveEPS("DuplicatedCurveWithItMode2.eps");
471 }
472  trace.endBlock();
473 
474 
475  trace.beginBlock("Segmentation of a subrange of a duplicated range (mode3)");
476 {
477  Board2D aBoard;
478  aBoard << SetMode("PointVector", "Grid") << fc2;
479  aBoard << SetMode("PointVector", "Paving") << *start2 << *stop2;
480 
481  segmentationIntoDSSs<RAConstIterator,Board2D>
482  (vPts2.begin(),vPts2.end(),
483  start2,stop2,
484  "DoNotTruncate",aBoard);
485 
486  aBoard.saveEPS("DuplicatedCurveWithItMode3.eps");
487 }
488  trace.endBlock();
489 
490 
492 // closed digital curve with circulators
493 
494  ConstCirculator c2(start2,start2,stop2);
495 
496  trace.beginBlock("Segmentation of a whole range (mode1) with circulators");
497 {
498  Board2D aBoard;
499  aBoard << SetMode("PointVector", "Grid") << fc2;
500 
501  segmentationIntoDSSs<ConstCirculator,Board2D>
502  (c2,c2,c2,c2,
503  "Truncate",aBoard);
504 
505  aBoard.saveEPS("ClosedCurveWithCircMode1.eps");
506 }
507  trace.endBlock();
508 
509  trace.beginBlock("Segmentation of a whole range (mode2) with circulators");
510 {
511  Board2D aBoard;
512  aBoard << SetMode("PointVector", "Grid") << fc2;
513 
514  segmentationIntoDSSs<ConstCirculator,Board2D>
515  (c2,c2,c2,c2,
516  "Truncate+1",aBoard);
517 
518  aBoard.saveEPS("ClosedCurveWithCircMode2.eps");
519 }
520  trace.endBlock();
521 
522 
523  trace.beginBlock("Segmentation of a whole range (mode3) with circulators");
524 {
525  Board2D aBoard;
526  aBoard << SetMode("PointVector", "Grid") << fc2;
527 
528  segmentationIntoDSSs<ConstCirculator,Board2D>
529  (c2,c2,c2,c2,
530  "DoNotTruncate",aBoard);
531 
532  aBoard.saveEPS("ClosedCurveWithCircMode3.eps");
533 }
534  trace.endBlock();
535 
536 
538  return true;
539 }
540 
541 
543 // Functions for testing class SaturatedSegmentation
545 
546 
547 
551 bool SaturatedSegmentationVisualTest()
552 {
553 
554  typedef int Coordinate;
555  typedef FreemanChain<Coordinate> FC;
556  typedef FreemanChain<Coordinate>::ConstIterator ConstIterator;
557 
558  std::string filename = testPath + "samples/manche.fc";
559 
560  std::fstream fst;
561  fst.open (filename.c_str(), std::ios::in);
562  FC fc(fst);
563 
565 // whole open curve
566 
567  trace.beginBlock("Simple saturated Segmentation (mode=First)");
568 {
569  Board2D aBoard;
570  aBoard << SetMode("PointVector", "Grid") << fc;
571 
572  segmentationIntoMaximalDSSs<ConstIterator,Board2D>
573  (fc.begin(),fc.end(),
574  fc.begin(),fc.end(),
575  "First",aBoard);
576 
577  aBoard.saveEPS("MSOpenCurve2.eps");
578 }
579  trace.endBlock();
580 
581  trace.beginBlock("Simple saturated Segmentation (mode=MostCentered)");
582 {
583  Board2D aBoard;
584  aBoard << SetMode("PointVector", "Grid") << fc;
585 
586  segmentationIntoMaximalDSSs<ConstIterator,Board2D>
587  (fc.begin(),fc.end(),
588  fc.begin(),fc.end(),
589  "MostCentered",aBoard);
590 
591  aBoard.saveEPS("MSOpenCurve3.eps");
592 }
593  trace.endBlock();
594 
595  trace.beginBlock("Simple saturated Segmentation (mode=Last)");
596 {
597  Board2D aBoard;
598  aBoard << SetMode("PointVector", "Grid") << fc;
599 
600  segmentationIntoMaximalDSSs<ConstIterator,Board2D>
601  (fc.begin(),fc.end(),
602  fc.begin(),fc.end(),
603  "Last",aBoard);
604 
605  aBoard.saveEPS("MSOpenCurve4.eps");
606 }
607  trace.endBlock();
608 
610 // subrange
611 
612  typedef vector<PointVector<2,Coordinate> > Curve;
613  typedef Curve::const_iterator RAConstIterator;
614 
615  Curve vPts;
616  vPts.assign ( fc.begin(), fc.end() );
617 
618  RAConstIterator start = vPts.begin()+190;
619  RAConstIterator stop = vPts.begin()+400;
620 
621 trace.info() << *start << " " << *stop << endl;
622 
623 
624  trace.beginBlock("saturated Segmentation of a subrange (mode=First)");
625 {
626  Board2D aBoard;
627  aBoard << SetMode("PointVector", "Grid") << fc;
628  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
629 
630  segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
631  (vPts.begin(),vPts.end(),
632  start,stop,
633  "First",aBoard);
634 
635  aBoard.saveEPS("MSOpenCurvePart2.eps");
636 }
637  trace.endBlock();
638 
639  trace.beginBlock("saturated Segmentation of a subrange (mode=MostCentered)");
640 {
641  Board2D aBoard;
642  aBoard << SetMode("PointVector", "Grid") << fc;
643  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
644 
645  segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
646  (vPts.begin(),vPts.end(),
647  start,stop,
648  "MostCentered",aBoard);
649 
650  aBoard.saveEPS("MSOpenCurvePart3.eps");
651 }
652  trace.endBlock();
653 
654  trace.beginBlock("saturated Segmentation of a subrange (mode=Last)");
655 {
656  Board2D aBoard;
657  aBoard << SetMode("PointVector", "Grid") << fc;
658  aBoard << SetMode("PointVector", "Paving") << *start << *stop;
659 
660  segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
661  (vPts.begin(),vPts.end(),
662  start,stop,
663  "Last",aBoard);
664 
665  aBoard.saveEPS("MSOpenCurvePart4.eps");
666 }
667  trace.endBlock();
668 
669 
671 // using circulators
672 
673  typedef Circulator<RAConstIterator> ConstCirculator;
674  ConstCirculator c(vPts.begin(),vPts.begin(),vPts.end());
675 
676 
677  trace.beginBlock("Segmentation of a range bounded by circulators (mode=First)");
678 {
679  Board2D aBoard;
680  aBoard << SetMode("PointVector", "Grid") << fc;
681 
682  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
683  (c,c,c,c,
684  "First",aBoard);
685 
686  aBoard.saveEPS("MSOpenCurveWithCirc2.eps");
687 }
688  trace.endBlock();
689 
690  trace.beginBlock("Segmentation of a range bounded by circulators (mode=MostCentered)");
691 {
692  Board2D aBoard;
693  aBoard << SetMode("PointVector", "Grid") << fc;
694 
695  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
696  (c,c,c,c,
697  "MostCentered",aBoard);
698 
699  aBoard.saveEPS("MSOpenCurveWithCirc3.eps");
700 }
701  trace.endBlock();
702 
703  trace.beginBlock("Segmentation of a range bounded by circulators (mode=Last)");
704 {
705  Board2D aBoard;
706  aBoard << SetMode("PointVector", "Grid") << fc;
707 
708  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
709  (c,c,c,c,
710  "Last",aBoard);
711 
712  aBoard.saveEPS("MSOpenCurveWithCirc4.eps");
713 }
714  trace.endBlock();
715 
716 
718 // subrange with circulators
719 
720  ConstCirculator cstart(start,vPts.begin(),vPts.end());
721  ConstCirculator cstop(stop,vPts.begin(),vPts.end());
722 
723 
724  trace.beginBlock("Segmentation of a subrange with circulators (mode=First)");
725 {
726  Board2D aBoard;
727  aBoard << SetMode("PointVector", "Grid") << fc;
728  aBoard << SetMode("PointVector", "Paving") << *cstart << *cstop;
729 
730  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
731  (c,c,cstart,cstop,
732  "First",aBoard);
733 
734  aBoard.saveEPS("MSOpenCurvePartWithCirc2.eps");
735 }
736  trace.endBlock();
737 
738  trace.beginBlock("Segmentation of a subrange with circulators (mode=MostCentered)");
739 {
740  Board2D aBoard;
741  aBoard << SetMode("PointVector", "Grid") << fc;
742  aBoard << SetMode("PointVector", "Paving") << *cstart << *cstop;
743 
744  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
745  (c,c,cstart,cstop,
746  "MostCentered",aBoard);
747 
748  aBoard.saveEPS("MSOpenCurvePartWithCirc3.eps");
749 }
750  trace.endBlock();
751 
752  trace.beginBlock("Segmentation of a subrange with circulators (mode=Last)");
753 {
754  Board2D aBoard;
755  aBoard << SetMode("PointVector", "Grid") << fc;
756  aBoard << SetMode("PointVector", "Paving") << *cstart << *cstop;
757 
758  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
759  (c,c,cstart,cstop,
760  "Last",aBoard);
761 
762  aBoard.saveEPS("MSOpenCurvePartWithCirc4.eps");
763 }
764  trace.endBlock();
765 
767 // closed digital curve with circulators
768 
769  std::stringstream ss(stringstream::in | stringstream::out);
770  ss << "31 16 1112121212121221212121221212212222232232323332333333332333332330333033003030000010001001001000100010101010111" << endl;
771 
772  // Construct the Freeman chain
773  FC fc2(ss);
774 
775  Curve vPts2;
776  vPts2.assign( fc2.begin(), fc2.end() );
777  vPts2.insert( vPts2.end(), fc2.begin(), fc2.end() );
778  vPts2.insert( vPts2.end(), fc2.begin(), fc2.end() );
779 
780  RAConstIterator start2 = vPts2.begin() + fc2.size()+1;
781  RAConstIterator stop2 = start2 + fc2.size()+1;
782 
783  trace.info() << *start2 << " " << *stop2 << endl;
784 
785  trace.beginBlock("Satured Segmentation of a duplicated range (mode2)");
786 {
787  Board2D aBoard;
788  aBoard << SetMode("PointVector", "Grid") << fc2;
789  aBoard << SetMode("PointVector", "Paving") << *start2 << *stop2;
790 
791  segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
792  (vPts2.begin(),vPts2.end(),
793  start2,stop2,
794  "First",aBoard);
795 
796  aBoard.saveEPS("MSClosedCurveWithIt2.eps");
797 }
798  trace.endBlock();
799 
800  trace.beginBlock("Satured Segmentation of a duplicated range (mode3)");
801 {
802  Board2D aBoard;
803  aBoard << SetMode("PointVector", "Grid") << fc2;
804  aBoard << SetMode("PointVector", "Paving") << *start2 << *stop2;
805 
806  segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
807  (vPts2.begin(),vPts2.end(),
808  start2,stop2,
809  "MostCentered",aBoard);
810 
811  aBoard.saveEPS("MSClosedCurveWithIt3.eps");
812 }
813  trace.endBlock();
814 
815 
816  trace.beginBlock("Satured Segmentation of a duplicated range (mode4)");
817 {
818  Board2D aBoard;
819  aBoard << SetMode("PointVector", "Grid") << fc2;
820  aBoard << SetMode("PointVector", "Paving") << *start2 << *stop2;
821 
822  segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
823  (vPts2.begin(),vPts2.end(),
824  start2,stop2,
825  "Last",aBoard);
826 
827  aBoard.saveEPS("MSClosedCurveWithIt4.eps");
828 }
829  trace.endBlock();
830 
831 
834 
835  Curve vPts3;
836  vPts3.assign( fc2.begin(), fc2.end() );
837 
838  ConstCirculator c2(vPts3.begin(),vPts3.begin(),vPts3.end());
839 
840  trace.beginBlock("saturated Segmentation of a closed digital curve (mode=First)");
841 {
842  Board2D aBoard;
843  aBoard << SetMode("PointVector", "Grid") << fc2;
844  aBoard << SetMode("PointVector", "Paving") << *c2;
845 
846  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
847  (c2,c2,c2,c2,
848  "First",aBoard);
849 
850  aBoard.saveEPS("MSClosedCurveWithCirc2.eps");
851 }
852  trace.endBlock();
853 
854  trace.beginBlock("saturated Segmentation of a closed digital curve (mode=MostCentered)");
855 {
856  Board2D aBoard;
857  aBoard << SetMode("PointVector", "Grid") << fc2;
858  aBoard << SetMode("PointVector", "Paving") << *c2;
859 
860  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
861  (c2,c2,c2,c2,
862  "MostCentered",aBoard);
863 
864  aBoard.saveEPS("MSClosedCurveWithCirc3.eps");
865 }
866  trace.endBlock();
867 
868  trace.beginBlock("saturated Segmentation of a closed digital curve (mode=Last)");
869 {
870  Board2D aBoard;
871  aBoard << SetMode("PointVector", "Grid") << fc2;
872  aBoard << SetMode("PointVector", "Paving") << *c2;
873 
874  segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
875  (c2,c2,c2,c2,
876  "Last",aBoard);
877 
878  aBoard.saveEPS("MSClosedCurveWithCirc4.eps");
879 }
880  trace.endBlock();
881 
883 
884  return true;
885 
886 }
887 
888 
892 bool SaturatedSegmentationTest()
893 {
894 
895  typedef int Coordinate;
896  typedef FreemanChain<Coordinate> FC;
897 
898  std::string filename = testPath + "samples/BigBall2.fc";
899 
900  std::fstream fst;
901  fst.open (filename.c_str(), std::ios::in);
902  FC fc(fst);
903 
905 
906  vector<Point> vPts;
907  vPts.assign(fc.begin(),fc.end());
908 
909  typedef vector<Point>::const_iterator ConstIterator;
910  typedef Circulator<ConstIterator> ConstCirculator;
911 
912  Circulator<ConstIterator> c(vPts.begin(), vPts.begin(), vPts.end() );
913 
914  typedef ArithmeticalDSS<ConstCirculator,Coordinate,4> RecognitionAlgorithm;
915  typedef SaturatedSegmentation<RecognitionAlgorithm> Segmentation;
916 
917  trace.beginBlock("saturated Segmentation");
918  trace.info() << filename << endl;
919 
920  RecognitionAlgorithm algo;
921  Segmentation s(c,c,algo);
922  s.setMode("First");
923 
924  Segmentation::SegmentComputerIterator begin = s.begin();
925  Segmentation::SegmentComputerIterator end = s.end();
926 
927  unsigned int compteur = 0;
928  for (Segmentation::SegmentComputerIterator i(begin); i != end; ++i) {
929  ++compteur;
930  }
931 
932  trace.info() << "# nbpts nbsegments " << endl;
933  trace.info() << fc.size()+1 << " " << compteur << endl;
934 
935  trace.endBlock();
936 
937  return (compteur == 4295);
938 }
939 
943 
944 int main(int argc, char **argv)
945 {
946 
947  trace.beginBlock ( "Testing class GreedyDecomposition and SaturatedSegmentation" );
948  trace.info() << "Args:";
949  for ( int i = 0; i < argc; ++i )
950  trace.info() << " " << argv[ i ];
951  trace.info() << endl;
952 
953  bool res = greedySegmentationVisualTest()
954 && SaturatedSegmentationVisualTest()
955 && SaturatedSegmentationTest()
956 ;
957 
958  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
959  trace.endBlock();
960 
961  return res ? 0 : 1;
962 
963 }