46#include <visp3/core/vpConfig.h>
48#if defined(VISP_HAVE_MODULE_BLOB) && defined(VISP_HAVE_DISPLAY)
50#include <visp3/blob/vpDot.h>
51#include <visp3/core/vpImage.h>
52#include <visp3/core/vpImagePoint.h>
53#include <visp3/core/vpIoTools.h>
54#include <visp3/gui/vpDisplayFactory.h>
55#include <visp3/io/vpImageIo.h>
56#include <visp3/io/vpParseArgv.h>
59#define GETOPTARGS "cdf:hi:l:p:s:"
61#ifdef ENABLE_VISP_NAMESPACE
65void usage(
const char *name,
const char *badparam,
const std::string &ipath,
const std::string &ppath,
unsigned first,
66 unsigned last,
unsigned step);
67bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
unsigned &last,
68 unsigned &step,
bool &click_allowed,
bool &display);
81void usage(
const char *name,
const char *badparam,
const std::string &ipath,
const std::string &ppath,
unsigned first,
82 unsigned last,
unsigned step)
84#if defined(VISP_HAVE_DATASET)
85#if VISP_HAVE_DATASET_VERSION >= 0x030600
86 std::string ext(
"png");
88 std::string ext(
"pgm");
92 std::string ext(
"png");
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);
160bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
unsigned &last,
161 unsigned &step,
bool &click_allowed,
bool &display)
169 click_allowed =
false;
181 first =
static_cast<unsigned int>(atoi(optarg_));
184 last =
static_cast<unsigned int>(atoi(optarg_));
187 step =
static_cast<unsigned int>(atoi(optarg_));
190 usage(argv[0],
nullptr, ipath, ppath, first, last, step);
194 usage(argv[0], optarg_, ipath, ppath, first, last, step);
199 if ((c == 1) || (c == -1)) {
201 usage(argv[0],
nullptr, ipath, ppath, first, last, step);
202 std::cerr <<
"ERROR: " << std::endl;
203 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
210int main(
int argc,
const char **argv)
213 std::string env_ipath;
214 std::string opt_ipath;
216 std::string opt_ppath;
219 unsigned int opt_first = 1;
220 unsigned int opt_last = 500;
221 unsigned int opt_step = 1;
222 bool opt_click_allowed =
true;
223 bool opt_display =
true;
225#if defined(VISP_HAVE_DATASET)
226#if VISP_HAVE_DATASET_VERSION >= 0x030600
227 std::string ext(
"png");
229 std::string ext(
"pgm");
233 std::string ext(
"png");
241 if (!env_ipath.empty())
245 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
246 opt_display) ==
false) {
251 if (!opt_ipath.empty())
256 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
257 if (ipath != env_ipath) {
258 std::cout << std::endl <<
"WARNING: " << std::endl;
259 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
260 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
261 <<
" we skip the environment variable." << std::endl;
266 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
267 usage(argv[0],
nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step);
268 std::cerr << std::endl <<
"ERROR:" << std::endl;
269 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
270 <<
" environment variable to specify the location of the " << std::endl
271 <<
" image path where test images are located." << std::endl
272 <<
" Use -p <personal image path> option if you want to " << std::endl
273 <<
" use personal images." << std::endl
285 unsigned iter = opt_first;
287 if (opt_ppath.empty()) {
314 std::cout <<
"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;
336 display->init(I, 100, 100,
"Display...");
356 d.setGraphics(
false);
359 d.setComputeMoments(
true);
362 if (opt_display && opt_click_allowed) {
366 std::cout <<
"Click on a white dot you want to track..." << std::endl;
376 d.initTracking(I, ip);
380 while ((iter < opt_last) && (!quit)) {
382 if (opt_ppath.empty()) {
390 std::cout <<
"read: " <<
filename << std::endl;
397 std::cout <<
"Tracking on image: " <<
filename << std::endl;
405 std::cout << cog.
get_u() <<
" " << cog.
get_v() << std::endl;
406 std::cout <<
"Size:" << std::endl;
407 std::cout <<
" w: " <<
d.getWidth() <<
" h: " <<
d.getHeight() << std::endl;
408 std::cout <<
"Area: " <<
d.getArea() << std::endl;
409 std::cout <<
"Centered normalized moments nij:" << std::endl;
410 std::cout <<
" n20: " <<
d.get_nij()[0] << std::endl;
411 std::cout <<
" n11: " <<
d.get_nij()[1] << std::endl;
412 std::cout <<
" n02: " <<
d.get_nij()[2] << std::endl;
415 std::list<vpImagePoint> edges =
d.getEdges();
416 std::list<vpImagePoint>::const_iterator it;
417 for (it = edges.begin(); it != edges.end(); ++it) {
437 if (opt_display && opt_click_allowed && !quit) {
438 std::cout <<
"\nA click to exit..." << std::endl;
448 std::cout <<
"Catch an exception: " <<
e << std::endl;
457 std::cout <<
"visp_blob module or X11, GTK, GDI or OpenCV display "
458 "functionalities are required..."
static const vpColor blue
Class that defines generic functionalities for display.
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)
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)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
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 ...
Definition of the vpImage class member functions.
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
vpDisplay * allocateDisplay()
Return a newly allocated vpDisplay specialization if a GUI library is available or nullptr otherwise.
VISP_EXPORT double measureTimeMs()