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/vpMeLine.h>
54#include <visp3/visual_features/vpFeatureBuilder.h>
55#include <visp3/visual_features/vpFeatureLine.h>
58#define GETOPTARGS "Acdf:hi:l:p:r:s:S:t:T:vw:y"
60#ifdef ENABLE_VISP_NAMESPACE
64void usage(
const char *name,
const char *badparam,
const std::string &video_in_ipath,
const std::string &video_in_ppath,
65 unsigned video_in_first,
int video_in_last,
int video_in_step,
int me_range,
int me_sample_step,
66 int me_threshold,
unsigned int &sleep_ms);
67bool getOptions(
int argc,
const char **argv, std::string &video_in_ipath, std::string &video_in_ppath,
68 int &video_in_first,
int &video_in_last,
int &video_in_step,
69 bool &click_allowed,
bool &display,
bool &display_scale_auto,
70 std::string &video_out_save,
int &me_range,
int &me_sample_step,
int &me_threshold,
bool &step_by_step,
71 unsigned int &sleep_ms,
bool &verbose);
88void 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,
90 int me_threshold,
unsigned int &sleep_ms)
92#if defined(VISP_HAVE_DATASET)
93#if VISP_HAVE_DATASET_VERSION >= 0x030600
94 std::string ext(
"png");
96 std::string ext(
"pgm");
100 std::string ext(
"png");
103Tracking of a line.\n\
106 %s [-i <visp dataset directory>] [-p <personal image path>]\n\
107 [-f <video first image>] [-l <video last image>] [-s <video step>]\n\
108 [-r <moving-edge range] [-t <moving-edge threshold] [-S <moving-edge sample step>]\n\
109 [-w <output images sequence name>] [-T <sleep ms>]\n\
110 [-c] [-d] [-A] [-y] [-v] [-h]\n", name);
114 -i <visp dataset directory> %s\n\
115 Set image input path.\n\
116 From this path read \"line/image.%%04d.%s\" images. \n\
117 Setting the VISP_INPUT_IMAGE_PATH environment variable\n\
118 produces the same behaviour than using this option.\n\
120 -p <personal image path> %s\n\
121 Specify a personal sequence containing images \n\
123 By image sequence, we mean one file per image.\n\
124 Example : \"C:/Temp/visp-images/line/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 of the\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 step-by-step mode waiting for a mouse click to\n\
163 process next image.\n\
166 Sleep time in ms before processing next image.\n\
167 Allows to slow down the image processing. \n\
169 -w <output images sequence name> \n\
170 Save images with tracking results in overlay.\n\
171 Example: \"result/I%%04d.png\" \n\
174 When display is activated using -d option, enable\n\
175 windows auto scaling to fit the screen size. \n\
182 video_in_ipath.c_str(), ext.c_str(), video_in_ppath.c_str(), ext.c_str(), video_in_first, video_in_last,
183 video_in_step, me_range, me_sample_step, me_threshold, sleep_ms);
186 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
212bool 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,
215 std::string &video_out_save,
int &me_range,
int &me_sample_step,
int &me_threshold,
bool &step_by_step,
216 unsigned int &sleep_ms,
bool &verbose)
224 display_scale_auto =
true;
227 click_allowed =
false;
233 video_in_first = atoi(optarg_);
236 video_in_ipath = std::string(optarg_);
239 video_in_last = atoi(optarg_);
242 video_in_ppath = std::string(optarg_);
245 me_range = atoi(optarg_);
248 video_in_step = atoi(optarg_);
251 me_sample_step = atoi(optarg_);
254 me_threshold = atoi(optarg_);
257 sleep_ms = atoi(optarg_);
260 video_out_save = std::string(optarg_);
269 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, sleep_ms);
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, sleep_ms);
278 if ((c == 1) || (c == -1)) {
280 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, sleep_ms);
281 std::cerr <<
"ERROR: " << std::endl;
282 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
289int main(
int argc,
const char **argv)
291#if defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV)
292 std::string env_ipath;
293 std::string opt_ipath;
295 std::string opt_ppath;
296 std::string videoname;
300 int opt_me_range = 30;
301 int opt_me_sample_step = 5;
302 int opt_me_threshold = 20;
303 bool opt_click_allowed =
true;
304 bool opt_display =
true;
305 bool opt_display_scale_auto =
false;
306 bool opt_verbose =
false;
307 std::string opt_save;
308 bool opt_step_by_step =
false;
309 unsigned int opt_sleep_ms = 0;
316#if defined(VISP_HAVE_DATASET)
317#if VISP_HAVE_DATASET_VERSION >= 0x030600
318 std::string ext(
"png");
320 std::string ext(
"pgm");
324 std::string ext(
"png");
333 if (!env_ipath.empty())
337 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
338 opt_display, opt_display_scale_auto, opt_save,
339 opt_me_range, opt_me_sample_step, opt_me_threshold, opt_step_by_step, opt_sleep_ms, opt_verbose) ==
false) {
344 if (!opt_ipath.empty()) {
350 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
351 if (ipath != env_ipath) {
352 std::cout << std::endl <<
"WARNING: " << std::endl;
353 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
354 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
355 <<
" we skip the environment variable." << std::endl;
360 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
361 usage(argv[0],
nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step, opt_me_range, opt_me_sample_step, opt_me_threshold, opt_sleep_ms);
362 std::cerr << std::endl <<
"ERROR:" << std::endl;
363 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
364 <<
" environment variable to specify the location of the " << std::endl
365 <<
" image path where test images are located." << std::endl
366 <<
" Use -p <personal image path> option if you want to " << std::endl
367 <<
" use personal images." << std::endl
374 if (!opt_save.empty()) {
376 if (!parent.empty()) {
377 std::cout <<
"Create output directory: " << parent << std::endl;
383 if (opt_ppath.empty()) {
404 if (opt_display_scale_auto) {
407 std::stringstream ss;
413 ss <<
"Init tracker image " << image_name;
416 display->init(I, 10, 10, ss.str());
428 if (!opt_save.empty()) {
437 if (opt_me_range > 0) {
440 if (opt_me_sample_step > 0) {
443 if (opt_me_threshold > 0) {
451 std::cout <<
"Input video settings" << std::endl;
452 std::cout <<
" Name : " << g.
getFrameName() << std::endl;
455 std::cout <<
" Step : " << g.
getFrameStep() << std::endl;
456 std::cout <<
" Image size : " << I.getWidth() <<
" x " << I.getHeight() << std::endl;
458 std::cout <<
"Moving-edges settings" << std::endl;
460 std::cout <<
" Range : " << me_line.
getMe()->
getRange() << std::endl;
461 std::cout <<
" Threshold type: " << (me_line.
getMe()->getLikelihoodThresholdType() ==
vpMe::NORMALIZED_THRESHOLD ?
"normalized" :
"old threshold (to be avoided)") << std::endl;
464 if (!opt_save.empty()) {
465 std::cout <<
"Create video with tracking results" << std::endl;
466 std::cout <<
" Name : " << opt_save << std::endl;
469 if (opt_display && opt_click_allowed) {
486 if (opt_display && opt_click_allowed) {
487 std::cout <<
"A click to continue..." << std::endl;
496 while (!g.
end() && !quit) {
499 std::stringstream ss;
505 ss <<
"Image " << image_name;
509 std::cout <<
"-- " << ss.str() << std::endl;
515 if (opt_click_allowed) {
516 vpDisplay::displayText(I, 20, I.getWidth() - 150, std::string(
"Mode: ") + (opt_step_by_step ? std::string(
"step-by-step") : std::string(
"continuous")),
vpColor::red);
520 if (opt_step_by_step) {
538 if (opt_click_allowed) {
545 if (opt_step_by_step) {
546 opt_step_by_step =
false;
549 opt_step_by_step =
true;
555 if (!opt_save.empty()) {
564 if (opt_display && opt_click_allowed && !quit) {
576 std::cout <<
"Catch an exception: " <<
e << std::endl;
577 if (opt_display && opt_click_allowed) {
585 std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
594 std::cout <<
"visp_me module or X11, GTK, GDI or OpenCV display functionalities are required..." << std::endl;
Generic class defining intrinsic camera parameters.
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 setTitle(const vpImage< unsigned char > &I, const std::string &windowtitle)
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.
static void create(vpFeaturePoint &s, const vpCameraParameters &cam, const vpDot &d)
Class that defines a 2D line visual feature which is composed by two parameters that are and ,...
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 double deg(double rad)
Class that tracks in an image a line moving edges.
void display(const vpImage< unsigned char > &I, const vpColor &color, unsigned int thickness=1)
void track(const vpImage< unsigned char > &I)
void initTracking(const vpImage< unsigned char > &I)
void setDisplay(vpMeSite::vpMeSiteDisplayType select)
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...
bool isVideoFormat() const
void setLastFrameIndex(const long last_frame)
void open(vpImage< vpRGBa > &I) VP_OVERRIDE
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
void acquire(vpImage< vpRGBa > &I) VP_OVERRIDE
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.
VISP_EXPORT void sleepMs(double t)