Visual Servoing Platform  version 3.6.1 under development (2024-07-27)
tutorial-contour.cpp
1 
3 #include <cstdlib>
4 #include <iostream>
5 #include <visp3/core/vpConfig.h>
6 #include <visp3/core/vpImage.h>
7 #include <visp3/gui/vpDisplayGDI.h>
8 #include <visp3/gui/vpDisplayOpenCV.h>
9 #include <visp3/gui/vpDisplayX.h>
10 #include <visp3/io/vpImageIo.h>
11 
12 #if defined(VISP_HAVE_MODULE_IMGPROC) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
14 #include <visp3/imgproc/vpImgproc.h>
16 
17 #ifdef ENABLE_VISP_NAMESPACE
18 using namespace VISP_NAMESPACE_NAME;
19 #endif
20 
21 namespace
22 {
24 void displayContourInfo(const VISP_NAMESPACE_NAME::vpContour &contour, int level)
25 {
26  std::cout << "\nContour:" << std::endl;
27  std::cout << "\tlevel: " << level << std::endl;
28  std::cout << "\tcontour type: " << (contour.m_contourType == VISP_NAMESPACE_NAME::CONTOUR_OUTER ? "outer contour" : "hole contour")
29  << std::endl;
30  std::cout << "\tcontour size: " << contour.m_points.size() << std::endl;
31  std::cout << "\tnb children: " << contour.m_children.size() << std::endl;
32 
33  for (std::vector<VISP_NAMESPACE_NAME::vpContour *>::const_iterator it = contour.m_children.begin(); it != contour.m_children.end();
34  ++it) {
35  displayContourInfo(**it, level + 1);
36  }
37 }
39 
41 void drawContoursTree(vpImage<vpRGBa> &I, const VISP_NAMESPACE_NAME::vpContour &contour)
42 {
43  std::vector<std::vector<vpImagePoint> > contours;
44  contours.push_back(contour.m_points);
46 
47  for (std::vector<VISP_NAMESPACE_NAME::vpContour *>::const_iterator it = contour.m_children.begin(); it != contour.m_children.end();
48  ++it) {
49  drawContoursTree(I, **it);
50  }
51 }
53 } // namespace
54 #endif
55 
56 int main(int argc, const char **argv)
57 {
59 #if defined(VISP_HAVE_MODULE_IMGPROC) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
62  std::string input_filename = "grid36-03.pgm";
63  bool white_foreground = false;
65 
66  for (int i = 1; i < argc; i++) {
67  if (std::string(argv[i]) == "--input" && i + 1 < argc) {
68  input_filename = std::string(argv[i + 1]);
69  }
70  else if (std::string(argv[i]) == "--white_foreground") {
71  white_foreground = true;
72  }
73  else if (std::string(argv[i]) == "--method" && i + 1 < argc) {
74  extraction_method = (VISP_NAMESPACE_NAME::vpContourRetrievalType)atoi(argv[i + 1]);
75  }
76  else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {
77  std::cout << "Usage: " << argv[0]
78  << " [--input <input image>] [--method <0: "
79  "CONTOUR_RETR_TREE, 1: CONTOUR_RETR_LIST, 2: "
80  "CONTOUR_RETR_EXTERNAL>]"
81  " [--white_foreground] [--help]"
82  << std::endl;
83  return EXIT_SUCCESS;
84  }
85  }
86 
89  vpImageIo::read(I, input_filename);
92 
93  vpImage<vpRGBa> I_draw_contours(I.getHeight(), I.getWidth());
94 
95 #ifdef VISP_HAVE_X11
96  vpDisplayX d, d2;
97 #elif defined(VISP_HAVE_GDI)
98  vpDisplayGDI d, d2;
99 #elif defined(HAVE_OPENCV_HIGHGUI)
100  vpDisplayOpenCV d, d2;
101 #endif
102  d.init(I_bin, 0, 0, "After binarisation");
103  d2.init(I_draw_contours, I_bin.getWidth(), 10, "Contours");
104 
106  VISP_NAMESPACE_NAME::autoThreshold(I, VISP_NAMESPACE_NAME::AUTO_THRESHOLD_OTSU, white_foreground ? 0 : 1, white_foreground ? 1 : 0);
108  for (unsigned int i = 0; i < I_bin.getSize(); i++) {
109  I_bin.bitmap[i] = 255 * I.bitmap[i];
110  }
111 
113  VISP_NAMESPACE_NAME::vpContour vp_contours;
114  std::vector<std::vector<vpImagePoint> > contours;
115  VISP_NAMESPACE_NAME::findContours(I, vp_contours, contours, extraction_method);
117 
119  VISP_NAMESPACE_NAME::drawContours(I_draw_contours, contours, vpColor::red);
121 
122  vpDisplay::display(I_bin);
123  vpDisplay::display(I_draw_contours);
124  vpDisplay::displayText(I_draw_contours, 20, 20, "Click to draw outer / hole contours.", vpColor::red);
125  vpDisplay::flush(I_bin);
126  vpDisplay::flush(I_draw_contours);
127  vpDisplay::getClick(I_draw_contours);
128 
129  I_draw_contours = vpRGBa(0);
131  drawContoursTree(I_draw_contours, vp_contours);
133  displayContourInfo(vp_contours, 0);
134 
135  vpDisplay::display(I_bin);
136  vpDisplay::display(I_draw_contours);
137  vpDisplay::displayText(I_draw_contours, 20, 20, "Click to quit.", vpColor::red);
138  vpDisplay::displayText(I_draw_contours, 20, I_draw_contours.getWidth() - 200, "Outer contour", vpColor::red);
139  vpDisplay::displayText(I_draw_contours, 20, I_draw_contours.getWidth() - 100, "Hole contour", vpColor::green);
140  vpDisplay::flush(I_bin);
141  vpDisplay::flush(I_draw_contours);
142  vpDisplay::getClick(I_draw_contours);
143 #else
144  (void)argc;
145  (void)argv;
146 #endif
147  return EXIT_SUCCESS;
148 }
static const vpColor red
Definition: vpColor.h:217
static const vpColor green
Definition: vpColor.h:220
Display for windows using GDI (available on any windows 32 platform).
Definition: vpDisplayGDI.h:130
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition: vpDisplayX.h:135
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="") VP_OVERRIDE
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition: vpImageIo.cpp:147
unsigned int getWidth() const
Definition: vpImage.h:242
Type * bitmap
points toward the bitmap
Definition: vpImage.h:135
unsigned int getHeight() const
Definition: vpImage.h:181
Definition: vpRGBa.h:65
VISP_EXPORT void findContours(const VISP_NAMESPACE_ADDRESSING vpImage< unsigned char > &I_original, vpContour &contours, std::vector< std::vector< VISP_NAMESPACE_ADDRESSING vpImagePoint > > &contourPts, const vpContourRetrievalType &retrievalMode=CONTOUR_RETR_TREE)
VISP_EXPORT void drawContours(VISP_NAMESPACE_ADDRESSING vpImage< unsigned char > &I, const std::vector< std::vector< VISP_NAMESPACE_ADDRESSING vpImagePoint > > &contours, unsigned char grayValue=255)
VISP_EXPORT unsigned char autoThreshold(VISP_NAMESPACE_ADDRESSING vpImage< unsigned char > &I, const vpAutoThresholdMethod &method, const unsigned char backgroundValue=0, const unsigned char foregroundValue=255)
std::vector< vpContour * > m_children
Children contour.
Definition: vpContours.h:212
std::vector< VISP_NAMESPACE_ADDRESSING vpImagePoint > m_points
Vector of points belonging to the contour.
Definition: vpContours.h:218
vpContourType m_contourType
Contour type.
Definition: vpContours.h:214