41 #include <visp3/core/vpConfig.h>
42 #include <visp3/core/vpDebug.h>
49 #if defined(VISP_HAVE_MODULE_KLT) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
51 #if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_VIDEO)
53 #include <visp3/core/vpImage.h>
54 #include <visp3/core/vpIoTools.h>
55 #include <visp3/gui/vpDisplayGDI.h>
56 #include <visp3/gui/vpDisplayGTK.h>
57 #include <visp3/gui/vpDisplayOpenCV.h>
58 #include <visp3/gui/vpDisplayX.h>
59 #include <visp3/io/vpImageIo.h>
60 #include <visp3/io/vpParseArgv.h>
61 #include <visp3/klt/vpKltOpencv.h>
64 #define GETOPTARGS "cdf:i:l:p:s:h"
66 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
unsigned first,
67 unsigned last,
unsigned step);
68 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
unsigned &last,
69 unsigned &step,
bool &click_allowed,
bool &display);
91 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
unsigned first,
92 unsigned last,
unsigned step)
94 #if VISP_HAVE_DATASET_VERSION >= 0x030600
95 std::string ext(
"png");
97 std::string ext(
"pgm");
100 Example of KLT tracking using OpenCV library.\n\
103 %s [-i <test image path>] [-p <personal image path>]\n\
104 [-f <first image>] [-l <last image>] [-s <step>]\n\
110 -i <input image path> %s\n\
111 Set image input path.\n\
112 From this path read images \n\
113 \"mire-2/image.%%04d.%s\". These \n\
114 images come from visp-images-x.y.z.tar.gz available \n\
115 on the ViSP website.\n\
116 Setting the VISP_INPUT_IMAGE_PATH environment\n\
117 variable produces the same behaviour than using\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 : \"/Temp/visp-images/mire-2/image.%%04d.%s\"\n\
125 %%04d is for the image numbering.\n\
127 -f <first image> %u\n\
128 First image number of the sequence.\n\
130 -l <last image> %u\n\
131 Last image number of the sequence.\n\
134 Step between two images.\n\
137 Disable the mouse click. Useful to automate the \n\
138 execution of this program without human intervention.\n\
141 Turn off the display.\n\
145 ipath.c_str(), ext.c_str(), ppath.c_str(), ext.c_str(), first, last, step);
148 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
168 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
unsigned &last,
169 unsigned &step,
bool &click_allowed,
bool &display)
177 click_allowed =
false;
189 first = (unsigned)atoi(optarg_);
192 last = (unsigned)atoi(optarg_);
195 step = (unsigned)atoi(optarg_);
198 usage(argv[0],
nullptr, ipath, ppath, first, last, step);
203 usage(argv[0], optarg_, ipath, ppath, first, last, step);
209 if ((c == 1) || (c == -1)) {
211 usage(argv[0],
nullptr, ipath, ppath, first, last, step);
212 std::cerr <<
"ERROR: " << std::endl;
213 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
220 int main(
int argc,
const char **argv)
223 std::string env_ipath;
224 std::string opt_ipath;
226 std::string opt_ppath;
228 std::string filename;
229 unsigned opt_first = 1;
230 unsigned opt_last = 500;
231 unsigned opt_step = 1;
232 bool opt_click_allowed =
true;
233 bool opt_display =
true;
235 #if VISP_HAVE_DATASET_VERSION >= 0x030600
236 std::string ext(
"png");
238 std::string ext(
"pgm");
246 if (!env_ipath.empty())
250 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
251 opt_display) ==
false) {
256 if (!opt_ipath.empty())
261 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
262 if (ipath != env_ipath) {
263 std::cout << std::endl <<
"WARNING: " << std::endl;
264 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
265 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
266 <<
" we skip the environment variable." << std::endl;
271 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
272 usage(argv[0],
nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step);
273 std::cerr << std::endl <<
"ERROR:" << std::endl;
274 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
275 <<
" environment variable to specify the location of the " << std::endl
276 <<
" image path where test images are located." << std::endl
277 <<
" Use -p <personal image path> option if you want to " << std::endl
278 <<
" use personal images." << std::endl
290 unsigned iter = opt_first;
291 std::ostringstream s;
292 char cfilename[FILENAME_MAX];
294 if (opt_ppath.empty()) {
309 s.setf(std::ios::right, std::ios::adjustfield);
310 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
"." << ext;
314 snprintf(cfilename, FILENAME_MAX, opt_ppath.c_str(), iter);
315 filename = cfilename;
324 std::cout <<
"Load: " << filename << std::endl;
331 std::cerr << std::endl <<
"ERROR:" << std::endl;
332 std::cerr <<
" Cannot read " << filename << std::endl;
333 if (opt_ppath.empty()) {
334 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
335 <<
" or VISP_INPUT_IMAGE_PATH environment variable." << std::endl;
338 std::cerr <<
" Check your -p " << opt_ppath <<
" option " << std::endl;
344 #if defined(VISP_HAVE_X11)
346 #elif defined(VISP_HAVE_GTK)
348 #elif defined(VISP_HAVE_GDI)
350 #elif defined(HAVE_OPENCV_HIGHGUI)
356 display.init(vpI, 100, 100,
"Display...");
395 while (iter < opt_last) {
397 if (opt_ppath.empty()) {
399 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
"." << ext;
402 snprintf(cfilename, FILENAME_MAX, opt_ppath.c_str(), iter);
403 filename = cfilename;
420 std::cout <<
"Tracking on image: " << filename << std::endl;
434 if (opt_display && opt_click_allowed) {
435 std::cout <<
"\nA click to exit..." << std::endl;
441 std::cout <<
"Catch an exception: " << e << std::endl;
448 std::cout <<
"You do not have OpenCV functionalities to display images..." << std::endl;
449 std::cout <<
"Tip:" << std::endl;
450 std::cout <<
"- Install OpenCV, configure again ViSP using cmake and build again this example" << std::endl;
459 std::cout <<
"visp_klt module or X11, GTK, GDI or OpenCV display "
460 "functionalities are required..."
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...
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
error that can be emitted by ViSP classes.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Wrapper for the KLT (Kanade-Lucas-Tomasi) feature tracker implemented in OpenCV. Thus to enable this ...
void setBlockSize(int blockSize)
void setQuality(double qualityLevel)
void track(const cv::Mat &I)
void setTrackerId(int tid)
void setHarrisFreeParameter(double harris_k)
void setMaxFeatures(int maxCount)
void initTracking(const cv::Mat &I, const cv::Mat &mask=cv::Mat())
void setMinDistance(double minDistance)
void display(const vpImage< unsigned char > &I, const vpColor &color=vpColor::red, unsigned int thickness=1)
void setUseHarris(int useHarrisDetector)
void setWindowSize(int winSize)
void setPyramidLevels(int pyrMaxLevel)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
void display(vpImage< unsigned char > &I, const std::string &title)
Display a gray-scale image.
VISP_EXPORT double measureTimeMs()