52 #include <visp3/core/vpConfig.h> 53 #include <visp3/core/vpDebug.h> 60 #if defined(VISP_HAVE_MODULE_BLOB) && \ 61 (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV)) 63 #include <visp3/blob/vpDot.h> 64 #include <visp3/core/vpImage.h> 65 #include <visp3/core/vpImagePoint.h> 66 #include <visp3/core/vpIoTools.h> 67 #include <visp3/gui/vpDisplayGDI.h> 68 #include <visp3/gui/vpDisplayGTK.h> 69 #include <visp3/gui/vpDisplayOpenCV.h> 70 #include <visp3/gui/vpDisplayX.h> 71 #include <visp3/io/vpImageIo.h> 72 #include <visp3/io/vpParseArgv.h> 75 #define GETOPTARGS "cdf:i:n:p:s:h" 77 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
unsigned first,
78 unsigned nimages,
unsigned step);
79 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
unsigned &nimages,
80 unsigned &step,
bool &click_allowed,
bool &display);
95 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
unsigned first,
96 unsigned nimages,
unsigned step)
102 %s [-i <test image path>] [-p <personal image path>]\n\ 103 [-f <first image>] [-n <number of images>] [-s <step>]\n\ 104 [-c] [-d] [-h]\n", name);
108 -i <input image path> %s\n\ 109 Set image input path.\n\ 110 From this path read images \n\ 111 \"mire-2/image.%%04d.pgm\". These \n\ 112 images come from ViSP-images-x.y.z.tar.gz available \n\ 113 on the ViSP website.\n\ 114 Setting the VISP_INPUT_IMAGE_PATH environment\n\ 115 variable produces the same behaviour than using\n\ 118 -p <personal image path> %s\n\ 119 Specify a personal sequence containing images \n\ 121 By image sequence, we mean one file per image.\n\ 122 The following image file formats PNM (PGM P5, PPM P6)\n\ 123 are supported. The format is selected by analysing \n\ 124 the filename extension.\n\ 125 Example : \"C:/Temp/ViSP-images/cube/image.%%04d.pgm\"\n\ 126 %%04d is for the image numbering.\n\ 128 -f <first image> %u\n\ 129 First image number of the sequence.\n\ 131 -n <number of images> %u\n\ 132 Number of images to load from the sequence.\n\ 135 Step between two images.\n\ 138 Disable the mouse click. Useful to automaze the \n\ 139 execution of this program without humain intervention.\n\ 142 Turn off the display.\n\ 145 Print the help.\n", ipath.c_str(), ppath.c_str(), first, nimages, step);
148 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
167 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
unsigned &nimages,
168 unsigned &step,
bool &click_allowed,
bool &display)
176 click_allowed =
false;
188 first = (unsigned)atoi(optarg_);
191 nimages = (unsigned)atoi(optarg_);
194 step = (unsigned)atoi(optarg_);
197 usage(argv[0], NULL, ipath, ppath, first, nimages, step);
202 usage(argv[0], optarg_, ipath, ppath, first, nimages, step);
208 if ((c == 1) || (c == -1)) {
210 usage(argv[0], NULL, ipath, ppath, first, nimages, step);
211 std::cerr <<
"ERROR: " << std::endl;
212 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
219 int main(
int argc,
const char **argv)
222 std::string env_ipath;
223 std::string opt_ipath;
225 std::string opt_ppath;
227 std::string filename;
228 unsigned opt_first = 1;
229 unsigned opt_nimages = 500;
230 unsigned opt_step = 1;
231 bool opt_click_allowed =
true;
232 bool opt_display =
true;
239 if (!env_ipath.empty())
243 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_nimages, 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], NULL, ipath, opt_ppath, opt_first, opt_nimages, 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()) {
305 s.setf(std::ios::right, std::ios::adjustfield);
306 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
310 sprintf(cfilename, opt_ppath.c_str(), iter);
311 filename = cfilename;
321 vpCTRACE <<
"Load: " << filename << std::endl;
329 std::cerr << std::endl <<
"ERROR:" << std::endl;
330 std::cerr <<
" Cannot read " << filename << std::endl;
331 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
332 <<
" or VISP_INPUT_IMAGE_PATH environment variable." << std::endl;
337 #if defined VISP_HAVE_X11 339 #elif defined VISP_HAVE_GTK 341 #elif defined VISP_HAVE_GDI 343 #elif defined VISP_HAVE_OPENCV 349 display.
init(I, 100, 100,
"Display...");
374 if (opt_display && opt_click_allowed) {
378 std::cout <<
"Click on a white dot you want to track..." << std::endl;
391 while (iter < opt_first + opt_nimages * opt_step) {
393 if (opt_ppath.empty()) {
395 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
398 sprintf(cfilename, opt_ppath.c_str(), iter);
399 filename = cfilename;
402 std::cout <<
"read : " << filename << std::endl;
409 std::cout <<
"Tracking on image: " << filename << std::endl;
417 std::cout << cog.
get_u() <<
" " << cog.
get_v() << std::endl;
418 std::cout <<
"Size:" << std::endl;
420 std::cout <<
"Area: " << d.
getArea() << std::endl;
421 std::cout <<
"Centered normalized moments nij:" << std::endl;
422 std::cout <<
" n20: " << d.
get_nij()[0] << std::endl;
423 std::cout <<
" n11: " << d.
get_nij()[1] << std::endl;
424 std::cout <<
" n02: " << d.
get_nij()[2] << std::endl;
427 std::list<vpImagePoint> edges = d.
getEdges();
428 std::list<vpImagePoint>::const_iterator it;
429 for (it = edges.begin(); it != edges.end(); ++it) {
444 if (opt_display && opt_click_allowed) {
445 std::cout <<
"\nA click to exit..." << std::endl;
451 std::cout <<
"Catch an exception: " << e << std::endl;
460 std::cout <<
"visp_blob module or X11, GTK, GDI or OpenCV display " 461 "functionalities are required..." static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
void setConnexity(vpConnexityType type)
Display for windows using GDI (available on any windows 32 platform).
void setComputeMoments(bool activate)
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
void track(const vpImage< unsigned char > &I)
error that can be emited by ViSP classes.
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="")
static void displayPoint(const vpImage< unsigned char > &I, const vpImagePoint &ip, const vpColor &color, unsigned int thickness=1)
static void flush(const vpImage< unsigned char > &I)
VISP_EXPORT double measureTimeMs()
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
vpImagePoint getCog() const
static void display(const vpImage< unsigned char > &I)
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
unsigned int getHeight() const
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
This tracker is meant to track a dot (connected pixels with same gray level) on a vpImage...
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
unsigned int getWidth() const
void setGraphics(bool activate)
vpColVector get_nij() const
std::list< vpImagePoint > getEdges() const
void initTracking(const vpImage< unsigned char > &I)
static const vpColor blue