41 #include <visp3/core/vpConfig.h>
43 #if defined(VISP_HAVE_MODULE_ME) && defined(VISP_HAVE_DISPLAY)
45 #include <visp3/core/vpColor.h>
46 #include <visp3/core/vpImage.h>
47 #include <visp3/core/vpImagePoint.h>
48 #include <visp3/core/vpIoTools.h>
49 #include <visp3/gui/vpDisplayFactory.h>
50 #include <visp3/io/vpParseArgv.h>
51 #include <visp3/io/vpVideoReader.h>
52 #include <visp3/io/vpVideoWriter.h>
53 #include <visp3/me/vpMeEllipse.h>
56 #define GETOPTARGS "Aabcdf:hi:l:p:r:s:S:t:vw:"
58 #ifdef ENABLE_VISP_NAMESPACE
76 void usage(
const char *name,
const char *badparam,
const std::string &video_in_ipath,
const std::string &video_in_ppath,
77 unsigned video_in_first,
int video_in_last,
int video_in_step,
int me_range,
int me_sample_step,
int me_threshold)
79 #if VISP_HAVE_DATASET_VERSION >= 0x030600
80 std::string ext(
"png");
82 std::string ext(
"pgm");
85 Example of ellipse/circle or arc of ellipse/circle tracking using vpMeEllipse.\n\
88 %s [-i <visp dataset directory>] [-p <personal image path>]\n\
89 [-f <video first image>] [-l <video last image>] [-s <video step>]\n\
90 [-r <moving-edge range] [-t <moving-edge threshold] [-S <moving-edge sample step>]\n\
91 [-w <output images sequence name>] \n\
92 [-c] [-d] [-a] [-A] [-b] [-v] [-h]\n",
97 -i <visp dataset directory> %s\n\
98 Set visp dataset directory location.\n\
99 From this directory read images \n\
100 \"ellipse-1/image.%%04d.%s\"\n\
101 Setting the VISP_INPUT_IMAGE_PATH environment\n\
102 variable produces the same behaviour than using\n\
105 -p <personal image path> %s\n\
106 Specify a personal sequence containing images \n\
108 The format is selected by analyzing \n\
109 the filename extension.\n\
110 Example : \"C:/Temp/ViSP-images/ellipse-1/image.%%04d.%s\"\n\
111 %%04d is for the image numbering.\n\
113 -f <video first image> %d\n\
114 First image number to process.\n\
115 Set -1 to process the first image of the sequence.\n\
117 -l <video last image> %d\n\
118 Last image number to process. \n\
119 Set -1 to process images until the last image\n\
122 -s <video step> %d\n\
123 Step between two images.\n\
125 -r <moving-edge range> %d\n\
126 Moving-edge range.\n\
127 Increase value to consider large displacement. \n\
128 When set to -1, use default value. \n\
130 -S <moving-edge sample step> %d\n\
131 Moving-edge sample step.\n\
132 Distance between two moving-edges samples in degrees. \n\
133 When set to -1, use default value. \n\
135 -t <moving-edge threshold> %d\n\
136 Moving-edge threshold corresponding to the minimum \n\
137 contrast to consider. Value in range [0 ; 255] \n\
138 When set to -1, use default value. \n\
141 Disable the mouse click. Useful to automate the \n\
142 execution of this program without human intervention.\n\
145 Turn off the display.\n\
148 Enable arc of ellipse tracking.\n\
151 Enable circle tracking.\n\
153 -w <output images sequence name> \n\
154 Save images with tracking results in overlay.\n\
155 Example: \"result/I%%04d.png\" \n\
158 When display is activated using -d option, enable\n\
159 windows auto scaling to fit the screen size. \n\
166 video_in_ipath.c_str(), ext.c_str(), video_in_ppath.c_str(), ext.c_str(), video_in_first, video_in_last,
167 video_in_step, me_range, me_sample_step, me_threshold);
170 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
198 bool getOptions(
int argc,
const char **argv, std::string &video_in_ipath, std::string &video_in_ppath,
199 int &video_in_first,
int &video_in_last,
int &video_in_step,
200 bool &click_allowed,
bool &display,
bool &display_scale_auto,
bool &track_circle,
bool &track_arc,
201 std::string &video_out_save,
int &me_range,
int &me_sample_step,
int &me_threshold,
bool &verbose)
209 display_scale_auto =
true;
218 click_allowed =
false;
224 video_in_first = atoi(optarg_);
227 video_in_ipath = std::string(optarg_);
230 video_in_last = atoi(optarg_);
233 video_in_ppath = std::string(optarg_);
236 me_range = atoi(optarg_);
239 video_in_step = atoi(optarg_);
242 me_sample_step = atoi(optarg_);
245 me_threshold = atoi(optarg_);
248 video_out_save = std::string(optarg_);
254 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);
259 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);
265 if ((c == 1) || (c == -1)) {
267 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);
268 std::cerr <<
"ERROR: " << std::endl;
269 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
276 int main(
int argc,
const char **argv)
278 #if defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV)
279 std::string env_ipath;
280 std::string opt_ipath;
282 std::string opt_ppath;
283 std::string videoname;
287 int opt_me_range = 30;
288 int opt_me_sample_step = 5;
289 int opt_me_threshold = 20;
290 bool opt_click_allowed =
true;
291 bool opt_display =
true;
292 bool opt_display_scale_auto =
false;
293 bool opt_track_circle =
false;
294 bool opt_track_arc =
false;
295 bool opt_verbose =
false;
296 std::string opt_save;
297 unsigned int thickness = 1;
312 if (!env_ipath.empty())
316 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
317 opt_display, opt_display_scale_auto, opt_track_circle, opt_track_arc, opt_save,
318 opt_me_range, opt_me_sample_step, opt_me_threshold, opt_verbose) ==
false) {
323 if (!opt_ipath.empty()) {
329 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
330 if (ipath != env_ipath) {
331 std::cout << std::endl <<
"WARNING: " << std::endl;
332 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
333 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
334 <<
" we skip the environment variable." << std::endl;
339 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
340 usage(argv[0],
nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step, opt_me_range, opt_me_sample_step, opt_me_threshold);
341 std::cerr << std::endl <<
"ERROR:" << std::endl;
342 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
343 <<
" environment variable to specify the location of the " << std::endl
344 <<
" image path where test images are located." << std::endl
345 <<
" Use -p <personal image path> option if you want to " << std::endl
346 <<
" use personal images." << std::endl
353 if (!opt_save.empty()) {
355 if (!parent.empty()) {
356 std::cout <<
"Create output directory: " << parent << std::endl;
362 if (opt_ppath.empty()) {
364 #if VISP_HAVE_DATASET_VERSION >= 0x030600
387 if (opt_display_scale_auto) {
391 display->init(I, 10, 10,
"Current image");
403 if (!opt_save.empty()) {
411 if (opt_me_range > 0) {
414 if (opt_me_sample_step > 0) {
417 if (opt_me_threshold > 0) {
422 me_ellipse.
setMe(&me);
425 std::cout <<
"Video settings" << std::endl;
426 std::cout <<
" Name : " << g.
getFrameName() << std::endl;
429 std::cout <<
" Step : " << g.
getFrameStep() << std::endl;
430 std::cout <<
" Image size : " << I.
getWidth() <<
" x " << I.
getHeight() << std::endl;
432 std::cout <<
"Moving-edges settings" << std::endl;
434 std::cout <<
" Range : " << me_ellipse.
getMe()->
getRange() << std::endl;
438 if (opt_click_allowed) {
439 me_ellipse.
initTracking(I, opt_track_circle, opt_track_arc);
443 std::vector<vpImagePoint> ip;
450 me_ellipse.
initTracking(I, ip, opt_track_circle, opt_track_arc);
456 if (opt_display && opt_click_allowed) {
457 std::cout <<
"A click to continue..." << std::endl;
462 while (!g.
end() && !quit) {
465 std::stringstream ss;
468 std::cout <<
"-- " << ss.str() << std::endl;
474 if (opt_click_allowed) {
487 if (!opt_save.empty()) {
493 if (opt_display && opt_click_allowed && !quit) {
506 std::cout <<
"Catch an exception: " << e << std::endl;
507 if (opt_display && opt_click_allowed) {
515 std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
523 std::cout <<
"visp_me module or X11, GTK, GDI or OpenCV display "
524 "functionalities are required..."
static const vpColor green
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)
vpDisplay * allocateDisplay()
Return a newly allocated vpDisplay specialization if a GUI library is available or nullptr otherwise.