45 #include <visp3/core/vpConfig.h>
46 #include <visp3/core/vpDebug.h>
53 #if defined(VISP_HAVE_MODULE_ME) && \
54 (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
56 #include <visp3/core/vpColor.h>
57 #include <visp3/core/vpImage.h>
58 #include <visp3/core/vpImagePoint.h>
59 #include <visp3/core/vpIoTools.h>
60 #include <visp3/gui/vpDisplayGDI.h>
61 #include <visp3/gui/vpDisplayGTK.h>
62 #include <visp3/gui/vpDisplayOpenCV.h>
63 #include <visp3/gui/vpDisplayX.h>
64 #include <visp3/io/vpParseArgv.h>
65 #include <visp3/io/vpVideoReader.h>
66 #include <visp3/io/vpVideoWriter.h>
67 #include <visp3/me/vpMeEllipse.h>
70 #define GETOPTARGS "Aabcdf:hi:l:p:r:s:S:t:vw:"
72 #ifdef ENABLE_VISP_NAMESPACE
90 void usage(
const char *name,
const char *badparam,
const std::string &video_in_ipath,
const std::string &video_in_ppath,
91 unsigned video_in_first,
int video_in_last,
int video_in_step,
int me_range,
int me_sample_step,
int me_threshold)
93 #if VISP_HAVE_DATASET_VERSION >= 0x030600
94 std::string ext(
"png");
96 std::string ext(
"pgm");
99 Example of ellipse/circle or arc of ellipse/circle tracking using vpMeEllipse.\n\
102 %s [-i <visp dataset directory>] [-p <personal image path>]\n\
103 [-f <video first image>] [-l <video last image>] [-s <video step>]\n\
104 [-r <moving-edge range] [-t <moving-edge threshold] [-S <moving-edge sample step>]\n\
105 [-w <output images sequence name>] \n\
106 [-c] [-d] [-a] [-A] [-b] [-v] [-h]\n",
111 -i <visp dataset directory> %s\n\
112 Set visp dataset directory location.\n\
113 From this directory read images \n\
114 \"ellipse-1/image.%%04d.%s\"\n\
115 Setting the VISP_INPUT_IMAGE_PATH environment\n\
116 variable produces the same behaviour than using\n\
119 -p <personal image path> %s\n\
120 Specify a personal sequence containing images \n\
122 The format is selected by analyzing \n\
123 the filename extension.\n\
124 Example : \"C:/Temp/ViSP-images/ellipse-1/image.%%04d.%s\"\n\
125 %%04d is for the image numbering.\n\
127 -f <video first image> %d\n\
128 First image number to process.\n\
129 Set -1 to process the first image of the sequence.\n\
131 -l <video last image> %d\n\
132 Last image number to process. \n\
133 Set -1 to process images until the last image\n\
136 -s <video step> %d\n\
137 Step between two images.\n\
139 -r <moving-edge range> %d\n\
140 Moving-edge range.\n\
141 Increase value to consider large displacement. \n\
142 When set to -1, use default value. \n\
144 -S <moving-edge sample step> %d\n\
145 Moving-edge sample step.\n\
146 Distance between two moving-edges samples in degrees. \n\
147 When set to -1, use default value. \n\
149 -t <moving-edge threshold> %d\n\
150 Moving-edge threshold corresponding to the minimum \n\
151 contrast to consider. Value in range [0 ; 255] \n\
152 When set to -1, use default value. \n\
155 Disable the mouse click. Useful to automate the \n\
156 execution of this program without human intervention.\n\
159 Turn off the display.\n\
162 Enable arc of ellipse tracking.\n\
165 Enable circle tracking.\n\
167 -w <output images sequence name> \n\
168 Save images with tracking results in overlay.\n\
169 Example: \"result/I%%04d.png\" \n\
172 When display is activated using -d option, enable\n\
173 windows auto scaling to fit the screen size. \n\
180 video_in_ipath.c_str(), ext.c_str(), video_in_ppath.c_str(), ext.c_str(), video_in_first, video_in_last,
181 video_in_step, me_range, me_sample_step, me_threshold);
184 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
212 bool getOptions(
int argc,
const char **argv, std::string &video_in_ipath, std::string &video_in_ppath,
213 int &video_in_first,
int &video_in_last,
int &video_in_step,
214 bool &click_allowed,
bool &display,
bool &display_scale_auto,
bool &track_circle,
bool &track_arc,
215 std::string &video_out_save,
int &me_range,
int &me_sample_step,
int &me_threshold,
bool &verbose)
223 display_scale_auto =
true;
232 click_allowed =
false;
238 video_in_first = atoi(optarg_);
241 video_in_ipath = std::string(optarg_);
244 video_in_last = atoi(optarg_);
247 video_in_ppath = std::string(optarg_);
250 me_range = atoi(optarg_);
253 video_in_step = atoi(optarg_);
256 me_sample_step = atoi(optarg_);
259 me_threshold = atoi(optarg_);
262 video_out_save = std::string(optarg_);
268 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);
273 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);
279 if ((c == 1) || (c == -1)) {
281 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);
282 std::cerr <<
"ERROR: " << std::endl;
283 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
290 int main(
int argc,
const char **argv)
292 #if defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV)
293 std::string env_ipath;
294 std::string opt_ipath;
296 std::string opt_ppath;
297 std::string videoname;
301 int opt_me_range = 30;
302 int opt_me_sample_step = 5;
303 int opt_me_threshold = 20;
304 bool opt_click_allowed =
true;
305 bool opt_display =
true;
306 bool opt_display_scale_auto =
false;
307 bool opt_track_circle =
false;
308 bool opt_track_arc =
false;
309 bool opt_verbose =
false;
310 std::string opt_save;
311 unsigned int thickness = 1;
326 if (!env_ipath.empty())
330 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
331 opt_display, opt_display_scale_auto, opt_track_circle, opt_track_arc, opt_save,
332 opt_me_range, opt_me_sample_step, opt_me_threshold, opt_verbose) ==
false) {
337 if (!opt_ipath.empty()) {
343 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
344 if (ipath != env_ipath) {
345 std::cout << std::endl <<
"WARNING: " << std::endl;
346 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
347 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
348 <<
" we skip the environment variable." << std::endl;
353 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
354 usage(argv[0],
nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step, opt_me_range, opt_me_sample_step, opt_me_threshold);
355 std::cerr << std::endl <<
"ERROR:" << std::endl;
356 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
357 <<
" environment variable to specify the location of the " << std::endl
358 <<
" image path where test images are located." << std::endl
359 <<
" Use -p <personal image path> option if you want to " << std::endl
360 <<
" use personal images." << std::endl
367 if (!opt_save.empty()) {
369 if (!parent.empty()) {
370 std::cout <<
"Create output directory: " << parent << std::endl;
376 if (opt_ppath.empty()) {
378 #if VISP_HAVE_DATASET_VERSION >= 0x030600
400 #if defined(VISP_HAVE_X11)
401 display =
new vpDisplayX;
402 #elif defined(VISP_HAVE_GTK)
404 #elif defined(VISP_HAVE_GDI)
406 #elif defined(HAVE_OPENCV_HIGHGUI)
409 if (opt_display_scale_auto) {
413 display->init(I, 10, 10,
"Current image");
425 if (!opt_save.empty()) {
433 if (opt_me_range > 0) {
436 if (opt_me_sample_step > 0) {
439 if (opt_me_threshold > 0) {
444 me_ellipse.
setMe(&me);
447 std::cout <<
"Video settings" << std::endl;
448 std::cout <<
" Name : " << g.
getFrameName() << std::endl;
451 std::cout <<
" Step : " << g.
getFrameStep() << std::endl;
452 std::cout <<
" Image size : " << I.
getWidth() <<
" x " << I.
getHeight() << std::endl;
454 std::cout <<
"Moving-edges settings" << std::endl;
456 std::cout <<
" Range : " << me_ellipse.
getMe()->
getRange() << std::endl;
460 if (opt_click_allowed) {
461 me_ellipse.
initTracking(I, opt_track_circle, opt_track_arc);
465 std::vector<vpImagePoint> ip;
472 me_ellipse.
initTracking(I, ip, opt_track_circle, opt_track_arc);
478 if (opt_display && opt_click_allowed) {
479 std::cout <<
"A click to continue..." << std::endl;
484 while (!g.
end() && !quit) {
487 std::stringstream ss;
490 std::cout <<
"-- " << ss.str() << std::endl;
496 if (opt_click_allowed) {
506 if (!opt_save.empty()) {
510 if (opt_display && opt_click_allowed) {
517 if (opt_display && opt_click_allowed && !quit) {
530 std::cout <<
"Catch an exception: " << e << std::endl;
531 if (opt_display && opt_click_allowed) {
539 std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
547 std::cout <<
"visp_me module or X11, GTK, GDI or OpenCV display "
548 "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...
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)