Visual Servoing Platform version 3.6.0
Loading...
Searching...
No Matches
tutorial-count-coins.cpp
#include <cstdlib>
#include <iostream>
#include <visp3/core/vpImage.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/io/vpImageIo.h>
#if defined(VISP_HAVE_MODULE_IMGPROC)
#include <visp3/core/vpMomentObject.h>
#include <visp3/imgproc/vpImgproc.h>
#endif
int main(int argc, char *argv[])
{
#if defined(VISP_HAVE_MODULE_IMGPROC) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
std::string input_filename = "coins1.jpg";
bool white_foreground = false;
for (int i = 1; i < argc; i++) {
if (std::string(argv[i]) == "--input" && i + 1 < argc) {
input_filename = std::string(argv[i + 1]);
} else if (std::string(argv[i]) == "--method" && i + 1 < argc) {
method = (vp::vpAutoThresholdMethod)atoi(argv[i + 1]);
} else if (std::string(argv[i]) == "--white_foreground") {
white_foreground = true;
} else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {
std::cout << "Usage: " << argv[0]
<< " [--input <input image>]"
" [--method <0: Huang, 1: Intermodes, 2: IsoData, 3: "
"Mean, 4: Otsu, 5: Triangle>]"
" [--white_foreground]"
" [--help]"
<< std::endl;
return EXIT_SUCCESS;
}
}
vpImageIo::read(I, input_filename);
#ifdef VISP_HAVE_X11
vpDisplayX d, d2, d3, d4, d5;
#elif defined(VISP_HAVE_GDI)
vpDisplayGDI d, d2, d3, d4, d5;
#elif defined(HAVE_OPENCV_HIGHGUI)
vpDisplayOpenCV d, d2, d3, d4, d5;
#endif
d.init(I, 0, 0, "Coins");
vpImage<unsigned char> I_bin, I_fill;
I_bin = I;
vp::autoThreshold(I_bin, method, white_foreground ? 0 : 255, white_foreground ? 255 : 0);
d2.init(I_bin, I.getWidth(), 0, "Binarisation");
I_fill = I_bin;
vp::fillHoles(I_fill);
d3.init(I_fill, 0, I.getHeight() + 80, "Fill holes");
vpImage<unsigned char> I_open = I_fill;
vpImage<unsigned char> I_close = I_open;
d4.init(I_close, I.getWidth(), I.getHeight() + 80, "Closing");
vpImage<unsigned char> I_contours(I_close.getHeight(), I_close.getWidth());
for (unsigned int cpt = 0; cpt < I_close.getSize(); cpt++)
I_contours.bitmap[cpt] = I_close.bitmap[cpt] ? 1 : 0;
vp::vpContour vp_contours;
std::vector<std::vector<vpImagePoint> > contours;
vp::findContours(I_contours, vp_contours, contours, vp::CONTOUR_RETR_EXTERNAL);
vpImage<vpRGBa> I_draw_contours(I_contours.getHeight(), I_contours.getWidth(), vpRGBa());
vp::drawContours(I_draw_contours, contours, vpColor::red);
d5.init(I_draw_contours, 0, 2 * I.getHeight() + 80, "Contours");
vpDisplay::display(I_draw_contours);
int nb_coins = 0;
for (size_t i = 0; i < contours.size(); i++) {
std::vector<vpPoint> vec_p;
for (size_t j = 0; j < contours[i].size(); j++) {
vpPoint pt;
pt.set_x(contours[i][j].get_u());
pt.set_y(contours[i][j].get_v());
vec_p.push_back(pt);
}
obj.fromVector(vec_p);
// sign(m00) depends of the contour orientation (clockwise or
// counter-clockwise) that's why we use fabs
if (std::fabs(obj.get(0, 0)) >= I.getSize() / 200) {
nb_coins++;
std::stringstream ss;
ss << "Coin " << nb_coins;
int centroid_x = (int)std::fabs(obj.get(1, 0) / obj.get(0, 0));
int centroid_y = (int)std::fabs(obj.get(0, 1) / obj.get(0, 0));
vpDisplay::displayText(I_draw_contours, centroid_y, centroid_x - 20, ss.str(), vpColor::red);
}
}
vpDisplay::displayText(I_draw_contours, 20, 20, "Click to quit.", vpColor::red);
vpDisplay::flush(I_close);
vpDisplay::flush(I_draw_contours);
vpDisplay::getClick(I_draw_contours);
#else
(void)argc;
(void)argv;
#endif
return EXIT_SUCCESS;
}
static const vpColor red
Definition vpColor.h:211
Display for windows using GDI (available on any windows 32 platform).
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:132
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="")
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)
static void dilatation(vpImage< Type > &I, Type value, Type value_out, vpConnexityType connexity=CONNEXITY_4)
static void erosion(vpImage< Type > &I, Type value, Type value_out, vpConnexityType connexity=CONNEXITY_4)
Definition of the vpImage class member functions.
Definition vpImage.h:135
unsigned int getWidth() const
Definition vpImage.h:242
unsigned int getSize() const
Definition vpImage.h:223
Type * bitmap
points toward the bitmap
Definition vpImage.h:139
unsigned int getHeight() const
Definition vpImage.h:184
Class for generic objects.
void setType(vpObjectType input_type)
const std::vector< double > & get() const
void fromVector(std::vector< vpPoint > &points)
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
Definition vpPoint.h:77
void set_x(double x)
Set the point x coordinate in the image plane.
Definition vpPoint.cpp:508
void set_y(double y)
Set the point y coordinate in the image plane.
Definition vpPoint.cpp:510
VISP_EXPORT void findContours(const vpImage< unsigned char > &I_original, vpContour &contours, std::vector< std::vector< vpImagePoint > > &contourPts, const vpContourRetrievalType &retrievalMode=vp::CONTOUR_RETR_TREE)
VISP_EXPORT void drawContours(vpImage< unsigned char > &I, const std::vector< std::vector< vpImagePoint > > &contours, unsigned char grayValue=255)
VISP_EXPORT void fillHoles(vpImage< unsigned char > &I)
Definition vpMorph.cpp:45
VISP_EXPORT unsigned char autoThreshold(vpImage< unsigned char > &I, const vp::vpAutoThresholdMethod &method, const unsigned char backgroundValue=0, const unsigned char foregroundValue=255)
@ CONTOUR_RETR_EXTERNAL
Definition vpContours.h:201
vpAutoThresholdMethod
Definition vpImgproc.h:66
@ AUTO_THRESHOLD_OTSU
Definition vpImgproc.h:83