47 #include <visp3/core/vpConfig.h>
48 #include <visp3/core/vpDebug.h>
55 #if defined(VISP_HAVE_MODULE_ME) && \
56 (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
58 #include <visp3/core/vpColor.h>
59 #include <visp3/core/vpImage.h>
60 #include <visp3/core/vpImagePoint.h>
61 #include <visp3/core/vpIoTools.h>
62 #include <visp3/gui/vpDisplayGDI.h>
63 #include <visp3/gui/vpDisplayGTK.h>
64 #include <visp3/gui/vpDisplayOpenCV.h>
65 #include <visp3/gui/vpDisplayX.h>
66 #include <visp3/io/vpParseArgv.h>
67 #include <visp3/io/vpVideoReader.h>
68 #include <visp3/io/vpVideoWriter.h>
69 #include <visp3/me/vpMeEllipse.h>
72 #define GETOPTARGS "Aabcdf:hi:l:p:r:s:S:t:vw:"
88 void usage(
const char *name,
const char *badparam,
const std::string &video_in_ipath,
const std::string &video_in_ppath,
89 unsigned video_in_first,
int video_in_last,
int video_in_step,
int me_range,
int me_sample_step,
int me_threshold)
91 #if VISP_HAVE_DATASET_VERSION >= 0x030600
92 std::string ext(
"png");
94 std::string ext(
"pgm");
97 Example of ellipse/circle or arc of ellipse/circle tracking using vpMeEllipse.\n\
100 %s [-i <visp dataset directory>] [-p <personal image path>]\n\
101 [-f <video first image>] [-l <video last image>] [-s <video step>]\n\
102 [-r <moving-edge range] [-t <moving-edge threshold] [-S <moving-edge sample step>]\n\
103 [-w <output images sequence name>] \n\
104 [-c] [-d] [-a] [-A] [-b] [-v] [-h]\n",
109 -i <visp dataset directory> %s\n\
110 Set visp dataset directory location.\n\
111 From this directory read images \n\
112 \"ellipse-1/image.%%04d.%s\"\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 The format is selected by analyzing \n\
121 the filename extension.\n\
122 Example : \"C:/Temp/ViSP-images/ellipse-1/image.%%04d.%s\"\n\
123 %%04d is for the image numbering.\n\
125 -f <video first image> %d\n\
126 First image number to process.\n\
127 Set -1 to process the first image of the sequence.\n\
129 -l <video last image> %d\n\
130 Last image number to process. \n\
131 Set -1 to process images until the last image\n\
134 -s <video step> %d\n\
135 Step between two images.\n\
137 -r <moving-edge range> %d\n\
138 Moving-edge range.\n\
139 Increase value to consider large displacement. \n\
140 When set to -1, use default value. \n\
142 -S <moving-edge sample step> %d\n\
143 Moving-edge sample step.\n\
144 Distance between two moving-edges samples in degrees. \n\
145 When set to -1, use default value. \n\
147 -t <moving-edge threshold> %d\n\
148 Moving-edge threshold corresponding to the minimum \n\
149 contrast to consider. Value in range [0 ; 255] \n\
150 When set to -1, use default value. \n\
153 Disable the mouse click. Useful to automate the \n\
154 execution of this program without human intervention.\n\
157 Turn off the display.\n\
160 Enable arc of ellipse tracking.\n\
163 Enable circle tracking.\n\
165 -w <output images sequence name> \n\
166 Save images with tracking results in overlay.\n\
167 Example: \"result/I%%04d.png\" \n\
170 When display is activated using -d option, enable\n\
171 windows auto scaling to fit the screen size. \n\
178 video_in_ipath.c_str(), ext.c_str(), video_in_ppath.c_str(), ext.c_str(), video_in_first, video_in_last,
179 video_in_step, me_range, me_sample_step, me_threshold);
182 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
210 bool getOptions(
int argc,
const char **argv, std::string &video_in_ipath, std::string &video_in_ppath,
211 int &video_in_first,
int &video_in_last,
int &video_in_step,
212 bool &click_allowed,
bool &display,
bool &display_scale_auto,
bool &track_circle,
bool &track_arc,
213 std::string &video_out_save,
int &me_range,
int &me_sample_step,
int &me_threshold,
bool &verbose)
221 display_scale_auto =
true;
230 click_allowed =
false;
236 video_in_first = atoi(optarg_);
239 video_in_ipath = std::string(optarg_);
242 video_in_last = atoi(optarg_);
245 video_in_ppath = std::string(optarg_);
248 me_range = atoi(optarg_);
251 video_in_step = atoi(optarg_);
254 me_sample_step = atoi(optarg_);
257 me_threshold = atoi(optarg_);
260 video_out_save = std::string(optarg_);
266 usage(argv[0],
nullptr, video_in_ipath, video_in_ppath, video_in_first, video_in_last, video_in_step, me_range, me_sample_step, me_threshold);
271 usage(argv[0], optarg_, video_in_ipath, video_in_ppath, video_in_first, video_in_last, video_in_step, me_range, me_sample_step, me_threshold);
277 if ((c == 1) || (c == -1)) {
279 usage(argv[0],
nullptr, video_in_ipath, video_in_ppath, video_in_first, video_in_last, video_in_step, me_range, me_sample_step, me_threshold);
280 std::cerr <<
"ERROR: " << std::endl;
281 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
288 int main(
int argc,
const char **argv)
290 #if defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV)
291 std::string env_ipath;
292 std::string opt_ipath;
294 std::string opt_ppath;
295 std::string videoname;
299 int opt_me_range = 30;
300 int opt_me_sample_step = 5;
301 int opt_me_threshold = 20;
302 bool opt_click_allowed =
true;
303 bool opt_display =
true;
304 bool opt_display_scale_auto =
false;
305 bool opt_track_circle =
false;
306 bool opt_track_arc =
false;
307 bool opt_verbose =
false;
308 std::string opt_save;
309 unsigned int thickness = 1;
324 if (!env_ipath.empty())
328 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
329 opt_display, opt_display_scale_auto, opt_track_circle, opt_track_arc, opt_save,
330 opt_me_range, opt_me_sample_step, opt_me_threshold, opt_verbose) ==
false) {
335 if (!opt_ipath.empty())
340 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
341 if (ipath != env_ipath) {
342 std::cout << std::endl <<
"WARNING: " << std::endl;
343 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
344 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
345 <<
" we skip the environment variable." << std::endl;
350 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
351 usage(argv[0],
nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step, opt_me_range, opt_me_sample_step, opt_me_threshold);
352 std::cerr << std::endl <<
"ERROR:" << std::endl;
353 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
354 <<
" environment variable to specify the location of the " << std::endl
355 <<
" image path where test images are located." << std::endl
356 <<
" Use -p <personal image path> option if you want to " << std::endl
357 <<
" use personal images." << std::endl
364 if (!opt_save.empty()) {
366 if (!parent.empty()) {
367 std::cout <<
"Create output directory: " << parent << std::endl;
374 if (opt_ppath.empty()) {
376 #if VISP_HAVE_DATASET_VERSION >= 0x030600
398 #if defined(VISP_HAVE_X11)
400 #elif defined(VISP_HAVE_GTK)
402 #elif defined(VISP_HAVE_GDI)
404 #elif defined(HAVE_OPENCV_HIGHGUI)
407 if (opt_display_scale_auto) {
411 display->init(I, 10, 10,
"Current image");
423 if (!opt_save.empty()) {
431 if (opt_me_range > 0) {
434 if (opt_me_sample_step > 0) {
437 if (opt_me_threshold > 0) {
442 me_ellipse.
setMe(&me);
445 std::cout <<
"Video settings" << std::endl;
446 std::cout <<
" Name : " << g.
getFrameName() << std::endl;
449 std::cout <<
" Step : " << g.
getFrameStep() << std::endl;
450 std::cout <<
" Image size : " << I.
getWidth() <<
" x " << I.
getHeight() << std::endl;
452 std::cout <<
"Moving-edges settings" << std::endl;
454 std::cout <<
" Range : " << me_ellipse.
getMe()->
getRange() << std::endl;
458 if (opt_click_allowed) {
459 me_ellipse.
initTracking(I, opt_track_circle, opt_track_arc);
463 std::vector<vpImagePoint> ip;
470 me_ellipse.
initTracking(I, ip, opt_track_circle, opt_track_arc);
476 if (opt_display && opt_click_allowed) {
477 std::cout <<
"A click to continue..." << std::endl;
482 while (!g.
end() && !quit) {
485 std::stringstream ss;
488 std::cout <<
"-- " << ss.str() << std::endl;
494 if (opt_click_allowed) {
504 if (!opt_save.empty()) {
508 if (opt_display && opt_click_allowed) {
515 if (opt_display && opt_click_allowed && !quit) {
528 std::cout <<
"Catch an exception: " << e << std::endl;
529 if (opt_display && opt_click_allowed) {
537 std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
545 std::cout <<
"visp_me module or X11, GTK, GDI or OpenCV display "
546 "functionalities are required..."
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...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
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 getImage(const vpImage< unsigned char > &Is, vpImage< vpRGBa > &Id)
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)
error that can be emitted by ViSP classes.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
unsigned int getWidth() const
unsigned int getHeight() const
Class that tracks an ellipse using moving edges.
void display(const vpImage< unsigned char > &I, const vpColor &col, unsigned int thickness=1)
void initTracking(const vpImage< unsigned char > &I, bool trackCircle=false, bool trackArc=false)
void track(const vpImage< unsigned char > &I)
void setDisplay(vpMeSite::vpMeSiteDisplayType select)
vpLikelihoodThresholdType getLikelihoodThresholdType() const
void setRange(const unsigned int &range)
void setLikelihoodThresholdType(const vpLikelihoodThresholdType likelihood_threshold_type)
void setThreshold(const double &threshold)
void setSampleStep(const double &sample_step)
double getThreshold() const
double getSampleStep() const
unsigned int getRange() const
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Class that enables to manipulate easily a video file or a sequence of images. As it inherits from the...
void acquire(vpImage< vpRGBa > &I)
void setLastFrameIndex(const long last_frame)
void open(vpImage< vpRGBa > &I)
void setFileName(const std::string &filename)
void setFirstFrameIndex(const long first_frame)
long getFirstFrameIndex()
void setFrameStep(const long frame_step)
long getFrameStep() const
std::string getFrameName() const
long getFrameIndex() const
Class that enables to write easily a video file or a sequence of images.
void saveFrame(vpImage< vpRGBa > &I)
void setFileName(const std::string &filename)
void open(vpImage< vpRGBa > &I)
void display(vpImage< unsigned char > &I, const std::string &title)
Display a gray-scale image.