41 #include <visp3/core/vpConfig.h>
42 #include <visp3/core/vpDebug.h>
49 #if defined(VISP_HAVE_MODULE_BLOB) && \
50 (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
52 #include <visp3/blob/vpDot2.h>
53 #include <visp3/core/vpImage.h>
54 #include <visp3/core/vpImagePoint.h>
55 #include <visp3/core/vpIoTools.h>
56 #include <visp3/gui/vpDisplayGDI.h>
57 #include <visp3/gui/vpDisplayGTK.h>
58 #include <visp3/gui/vpDisplayOpenCV.h>
59 #include <visp3/gui/vpDisplayX.h>
60 #include <visp3/io/vpImageIo.h>
61 #include <visp3/io/vpParseArgv.h>
64 #define GETOPTARGS "cdf:i:l:p:s:h"
66 #ifdef ENABLE_VISP_NAMESPACE
88 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
unsigned first,
89 unsigned last,
unsigned step)
91 #if VISP_HAVE_DATASET_VERSION >= 0x030600
92 std::string ext(
"png");
94 std::string ext(
"pgm");
97 Test dot tracking using vpDot2 class.\n\
100 %s [-i <test image path>] [-p <personal image path>]\n\
101 [-f <first image>] [-l <last image>] [-s <step>]\n\
107 -i <input image path> %s\n\
108 Set image input path.\n\
109 From this path read images \n\
110 \"mire-2/image.%%04d.%s\". These \n\
111 images come from visp-images-x.y.z.tar.gz available \n\
112 on the ViSP website.\n\
113 Setting the VISP_INPUT_IMAGE_PATH environment\n\
114 variable produces the same behaviour than using\n\
117 -p <personal image path> %s\n\
118 Specify a personal sequence containing images \n\
120 By image sequence, we mean one file per image.\n\
121 Example : \"C:/Temp/visp-images/cube/image.%%04d.%s\"\n\
122 %%04d is for the image numbering.\n\
124 -f <first image> %u\n\
125 First image number of the sequence.\n\
127 -l <last image> %u\n\
128 Last image number of the sequence.\n\
131 Step between two images.\n\
134 Disable the mouse click. Useful to automate the \n\
135 execution of this program without human intervention.\n\
138 Turn off the display.\n\
142 ipath.c_str(), ext.c_str(), ppath.c_str(), ext.c_str(), first, last, step);
145 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
164 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
unsigned &last,
165 unsigned &step,
bool &click_allowed,
bool &display)
173 click_allowed =
false;
185 first = (unsigned)atoi(optarg_);
188 last = (unsigned)atoi(optarg_);
191 step = (unsigned)atoi(optarg_);
194 usage(argv[0],
nullptr, ipath, ppath, first, last, step);
199 usage(argv[0], optarg_, ipath, ppath, first, last, step);
205 if ((c == 1) || (c == -1)) {
207 usage(argv[0],
nullptr, ipath, ppath, first, last, step);
208 std::cerr <<
"ERROR: " << std::endl;
209 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
216 int main(
int argc,
const char **argv)
219 std::string env_ipath;
220 std::string opt_ipath;
222 std::string opt_ppath;
224 std::string filename;
225 unsigned opt_first = 1;
226 unsigned opt_last = 500;
227 unsigned opt_step = 1;
228 bool opt_click_allowed =
true;
229 bool opt_display =
true;
231 #if VISP_HAVE_DATASET_VERSION >= 0x030600
232 std::string ext(
"png");
234 std::string ext(
"pgm");
242 if (!env_ipath.empty())
246 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
247 opt_display) ==
false) {
252 if (!opt_ipath.empty())
257 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
258 if (ipath != env_ipath) {
259 std::cout << std::endl <<
"WARNING: " << std::endl;
260 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
261 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
262 <<
" we skip the environment variable." << std::endl;
267 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
268 usage(argv[0],
nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step);
269 std::cerr << std::endl <<
"ERROR:" << std::endl;
270 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
271 <<
" environment variable to specify the location of the " << std::endl
272 <<
" image path where test images are located." << std::endl
273 <<
" Use -p <personal image path> option if you want to " << std::endl
274 <<
" use personal images." << std::endl
285 unsigned iter = opt_first;
286 std::ostringstream s;
287 char cfilename[FILENAME_MAX];
289 if (opt_ppath.empty()) {
304 s.setf(std::ios::right, std::ios::adjustfield);
305 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
"." << ext;
309 snprintf(cfilename, FILENAME_MAX, opt_ppath.c_str(), iter);
310 filename = cfilename;
319 vpCTRACE <<
"Load: " << filename << std::endl;
325 std::cerr << std::endl <<
"ERROR:" << std::endl;
326 std::cerr <<
" Cannot read " << filename << std::endl;
327 if (opt_ppath.empty()) {
328 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
329 <<
" or VISP_INPUT_IMAGE_PATH environment variable." << std::endl;
332 std::cerr <<
" Check your -p " << opt_ppath <<
" option " << std::endl;
338 #if defined(VISP_HAVE_X11)
340 #elif defined(VISP_HAVE_GTK)
342 #elif defined(VISP_HAVE_GDI)
344 #elif defined(HAVE_OPENCV_HIGHGUI)
350 display.init(I, 100, 100,
"Display...");
379 d.setGraphics(
false);
384 d.setComputeMoments(
true);
385 d.setGrayLevelPrecision(0.90);
393 if (opt_display && opt_click_allowed) {
394 std::cout <<
"Click on a dot to track it." << std::endl;
401 d.initTracking(I, ip);
404 std::cout <<
"COG: " << std::endl;
406 std::cout <<
" u: " << cog.
get_u() <<
" v: " << cog.
get_v() << std::endl;
407 std::cout <<
"Size:" << std::endl;
409 std::cout <<
"Area: " << d.getArea() << std::endl;
410 std::cout <<
"Centered normalized moments nij:" << std::endl;
411 std::cout <<
" n20: " << d.get_nij()[0] << std::endl;
412 std::cout <<
" n11: " << d.get_nij()[1] << std::endl;
413 std::cout <<
" n02: " << d.get_nij()[2] << std::endl;
414 std::cout <<
"Settings:" << std::endl;
415 std::cout <<
" gray level min: " << d.getGrayLevelMin() << std::endl;
416 std::cout <<
" gray level max: " << d.getGrayLevelMax() << std::endl;
417 std::cout <<
" size precision: " << d.getSizePrecision() << std::endl;
418 std::cout <<
" gray level precision: " << d.getGrayLevelPrecision() << std::endl;
421 while (iter < opt_last) {
423 if (opt_ppath.empty()) {
425 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
"." << ext;
429 snprintf(cfilename, FILENAME_MAX, opt_ppath.c_str(), iter);
430 filename = cfilename;
433 std::cout <<
"read : " << filename << std::endl;
447 std::cout <<
"Tracking on image: " << filename << std::endl;
453 std::cout <<
" u: " << cog.
get_u() <<
" v: " << cog.
get_v() << std::endl;
454 std::cout <<
"Size:" << std::endl;
456 std::cout <<
"Area: " << d.getArea() << std::endl;
457 std::cout <<
"Centered normalized moments nij:" << std::endl;
458 std::cout <<
" n20: " << d.get_nij()[0] << std::endl;
459 std::cout <<
" n11: " << d.get_nij()[1] << std::endl;
460 std::cout <<
" n02: " << d.get_nij()[2] << std::endl;
461 std::cout <<
"Settings:" << std::endl;
462 std::cout <<
" gray level min: " << d.getGrayLevelMin() << std::endl;
463 std::cout <<
" gray level max: " << d.getGrayLevelMax() << std::endl;
464 std::cout <<
" size precision: " << d.getSizePrecision() << std::endl;
465 std::cout <<
" gray level precision: " << d.getGrayLevelPrecision() << std::endl;
469 std::list<vpImagePoint> edges;
471 std::list<vpImagePoint>::const_iterator it;
472 for (it = edges.begin(); it != edges.end(); ++it) {
487 if (opt_display && opt_click_allowed) {
488 std::cout <<
"\nA click to exit..." << std::endl;
495 std::cout <<
"Catch an exception: " << e << std::endl;
504 std::cout <<
"visp_me module or X11, GTK, GDI or OpenCV display "
505 "functionalities are required..."
static const vpColor blue
static const vpColor green
Display for windows using GDI (available on any windows 32 platform).
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
unsigned int getHeight() const
static void flush(const vpImage< unsigned char > &I)
static void displayPoint(const vpImage< unsigned char > &I, const vpImagePoint &ip, const vpColor &color, unsigned int thickness=1)
unsigned int getWidth() const
This tracker is meant to track a blob (connex pixels with same gray level) on a vpImage.
error that can be emitted by ViSP classes.
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
VISP_EXPORT double measureTimeMs()