48 #include <visp3/core/vpConfig.h>
49 #include <visp3/core/vpDebug.h>
56 #if defined(VISP_HAVE_MODULE_BLOB) && \
57 (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
59 #include <visp3/blob/vpDot.h>
60 #include <visp3/core/vpImage.h>
61 #include <visp3/core/vpImagePoint.h>
62 #include <visp3/core/vpIoTools.h>
63 #include <visp3/gui/vpDisplayGDI.h>
64 #include <visp3/gui/vpDisplayGTK.h>
65 #include <visp3/gui/vpDisplayOpenCV.h>
66 #include <visp3/gui/vpDisplayX.h>
67 #include <visp3/io/vpImageIo.h>
68 #include <visp3/io/vpParseArgv.h>
71 #define GETOPTARGS "cdf:hi:l:p:s:"
86 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
unsigned first,
87 unsigned last,
unsigned step)
89 #if VISP_HAVE_DATASET_VERSION >= 0x030600
90 std::string ext(
"png");
92 std::string ext(
"pgm");
98 %s [-i <test image path>] [-p <personal image path>]\n\
99 [-f <first image>] [-l <last image>] [-s <step>]\n\
100 [-c] [-d] [-h]\n", name);
104 -i <input image path> %s\n\
105 Set image input path.\n\
106 From this path read images \n\
107 \"mire-2/image.%%04d.%s\". These \n\
108 images come from visp-images-x.y.z.tar.gz available \n\
109 on the ViSP website.\n\
110 Setting the VISP_INPUT_IMAGE_PATH environment\n\
111 variable produces the same behaviour than using\n\
114 -p <personal image path> %s\n\
115 Specify a personal sequence containing images \n\
117 By image sequence, we mean one file per image.\n\
118 Example : \"C:/Temp/visp-images/cube/image.%%04d.%s\"\n\
119 %%04d is for the image numbering.\n\
121 -f <first image> %u\n\
122 First image number of the sequence.\n\
124 -l <last image> %u\n\
125 Last image number of the sequence.\n\
128 Step between two images.\n\
131 Disable the mouse click. Useful to automate the \n\
132 execution of this program without human intervention.\n\
135 Turn off the display.\n\
139 ipath.c_str(), ext.c_str(), ppath.c_str(), ext.c_str(), first, last, step);
142 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
161 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
unsigned &last,
162 unsigned &step,
bool &click_allowed,
bool &display)
170 click_allowed =
false;
182 first = (unsigned)atoi(optarg_);
185 last = (unsigned)atoi(optarg_);
188 step = (unsigned)atoi(optarg_);
191 usage(argv[0],
nullptr, ipath, ppath, first, last, step);
196 usage(argv[0], optarg_, ipath, ppath, first, last, step);
202 if ((c == 1) || (c == -1)) {
204 usage(argv[0],
nullptr, ipath, ppath, first, last, step);
205 std::cerr <<
"ERROR: " << std::endl;
206 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
213 int main(
int argc,
const char **argv)
216 std::string env_ipath;
217 std::string opt_ipath;
219 std::string opt_ppath;
221 std::string filename;
222 unsigned int opt_first = 1;
223 unsigned int opt_last = 500;
224 unsigned int opt_step = 1;
225 bool opt_click_allowed =
true;
226 bool opt_display =
true;
228 #if VISP_HAVE_DATASET_VERSION >= 0x030600
229 std::string ext(
"png");
231 std::string ext(
"pgm");
239 if (!env_ipath.empty())
243 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
244 opt_display) ==
false) {
249 if (!opt_ipath.empty())
254 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
255 if (ipath != env_ipath) {
256 std::cout << std::endl <<
"WARNING: " << std::endl;
257 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
258 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
259 <<
" we skip the environment variable." << std::endl;
264 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
265 usage(argv[0],
nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step);
266 std::cerr << std::endl <<
"ERROR:" << std::endl;
267 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
268 <<
" environment variable to specify the location of the " << std::endl
269 <<
" image path where test images are located." << std::endl
270 <<
" Use -p <personal image path> option if you want to " << std::endl
271 <<
" use personal images." << std::endl
282 unsigned iter = opt_first;
283 std::ostringstream s;
284 char cfilename[FILENAME_MAX];
286 if (opt_ppath.empty()) {
300 s.setf(std::ios::right, std::ios::adjustfield);
301 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
"." << ext;
305 snprintf(cfilename, FILENAME_MAX, opt_ppath.c_str(), iter);
306 filename = cfilename;
315 vpCTRACE <<
"Load: " << filename << std::endl;
320 std::cerr << std::endl <<
"ERROR:" << std::endl;
321 std::cerr <<
" Cannot read " << filename << std::endl;
322 if (opt_ppath.empty()) {
323 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
324 <<
" or VISP_INPUT_IMAGE_PATH environment variable." << std::endl;
327 std::cerr <<
" Check your -p " << opt_ppath <<
" option " << std::endl;
333 #if defined(VISP_HAVE_X11)
335 #elif defined(VISP_HAVE_GTK)
337 #elif defined(VISP_HAVE_GDI)
339 #elif defined(HAVE_OPENCV_HIGHGUI)
345 display.init(I, 100, 100,
"Display...");
364 d.setGraphics(
false);
367 d.setComputeMoments(
true);
370 if (opt_display && opt_click_allowed) {
374 std::cout <<
"Click on a white dot you want to track..." << std::endl;
383 d.initTracking(I, ip);
387 while (iter < opt_last) {
389 if (opt_ppath.empty()) {
391 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
"." << ext;
394 snprintf(cfilename, FILENAME_MAX, opt_ppath.c_str(), iter);
395 filename = cfilename;
398 std::cout <<
"read: " << filename << std::endl;
405 std::cout <<
"Tracking on image: " << filename << std::endl;
413 std::cout << cog.
get_u() <<
" " << cog.
get_v() << std::endl;
414 std::cout <<
"Size:" << std::endl;
416 std::cout <<
"Area: " << d.getArea() << std::endl;
417 std::cout <<
"Centered normalized moments nij:" << std::endl;
418 std::cout <<
" n20: " << d.get_nij()[0] << std::endl;
419 std::cout <<
" n11: " << d.get_nij()[1] << std::endl;
420 std::cout <<
" n02: " << d.get_nij()[2] << std::endl;
423 std::list<vpImagePoint> edges = d.getEdges();
424 std::list<vpImagePoint>::const_iterator it;
425 for (it = edges.begin(); it != edges.end(); ++it) {
440 if (opt_display && opt_click_allowed) {
441 std::cout <<
"\nA click to exit..." << std::endl;
447 std::cout <<
"Catch an exception: " << e << std::endl;
456 std::cout <<
"visp_blob module or X11, GTK, GDI or OpenCV display "
457 "functionalities are required..."
static const vpColor blue
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...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
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 dot (connected 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)
void display(vpImage< unsigned char > &I, const std::string &title)
Display a gray-scale image.
VISP_EXPORT double measureTimeMs()