Example of KLT tracking using OpenCV (Intel's Open source Computer Vision library).
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpDebug.h>
#include <iomanip>
#include <sstream>
#include <stdio.h>
#include <vector>
#if defined(VISP_HAVE_MODULE_KLT) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_VIDEO)
#include <visp3/core/vpImage.h>
#include <visp3/core/vpIoTools.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayGTK.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/io/vpImageIo.h>
#include <visp3/io/vpParseArgv.h>
#include <visp3/klt/vpKltOpencv.h>
#define GETOPTARGS "cdf:i:l:p:s:h"
#ifdef ENABLE_VISP_NAMESPACE
#endif
void usage(const char *name, const char *badparam, std::string ipath, std::string ppath, unsigned first,
unsigned last, unsigned step);
bool getOptions(int argc, const char **argv, std::string &ipath, std::string &ppath, unsigned &first, unsigned &last,
unsigned &step, bool &click_allowed, bool &display);
void usage(const char *name, const char *badparam, std::string ipath, std::string ppath, unsigned first,
unsigned last, unsigned step)
{
#if VISP_HAVE_DATASET_VERSION >= 0x030600
std::string ext("png");
#else
std::string ext("pgm");
#endif
fprintf(stdout, "\n\
Example of KLT tracking using OpenCV library.\n\
\n\
SYNOPSIS\n\
%s [-i <test image path>] [-p <personal image path>]\n\
[-f <first image>] [-l <last image>] [-s <step>]\n\
[-c] [-d] [-h]\n",
name);
fprintf(stdout, "\n\
OPTIONS: Default\n\
-i <input image path> %s\n\
Set image input path.\n\
From this path read images \n\
\"mire-2/image.%%04d.%s\". These \n\
images come from visp-images-x.y.z.tar.gz available \n\
on the ViSP website.\n\
Setting the VISP_INPUT_IMAGE_PATH environment\n\
variable produces the same behaviour than using\n\
this option.\n\
\n\
-p <personal image path> %s\n\
Specify a personal sequence containing images \n\
to process.\n\
By image sequence, we mean one file per image.\n\
Example : \"/Temp/visp-images/mire-2/image.%%04d.%s\"\n\
%%04d is for the image numbering.\n\
\n\
-f <first image> %u\n\
First image number of the sequence.\n\
\n\
-l <last image> %u\n\
Last image number of the sequence.\n\
\n\
-s <step> %u\n\
Step between two images.\n\
\n\
-c\n\
Disable the mouse click. Useful to automate the \n\
execution of this program without human intervention.\n\
\n\
-d \n\
Turn off the display.\n\
\n\
-h\n\
Print the help.\n",
ipath.c_str(), ext.c_str(), ppath.c_str(), ext.c_str(), first, last, step);
if (badparam)
fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
}
bool getOptions(int argc, const char **argv, std::string &ipath, std::string &ppath, unsigned &first, unsigned &last,
unsigned &step, bool &click_allowed, bool &display)
{
const char *optarg_;
int c;
switch (c) {
case 'c':
click_allowed = false;
break;
case 'd':
display = false;
break;
case 'i':
ipath = optarg_;
break;
case 'p':
ppath = optarg_;
break;
case 'f':
first = (unsigned)atoi(optarg_);
break;
case 'l':
last = (unsigned)atoi(optarg_);
break;
case 's':
step = (unsigned)atoi(optarg_);
break;
case 'h':
usage(argv[0], nullptr, ipath, ppath, first, last, step);
return false;
break;
default:
usage(argv[0], optarg_, ipath, ppath, first, last, step);
return false;
break;
}
}
if ((c == 1) || (c == -1)) {
usage(argv[0], nullptr, ipath, ppath, first, last, step);
std::cerr << "ERROR: " << std::endl;
std::cerr << " Bad argument " << optarg_ << std::endl << std::endl;
return false;
}
return true;
}
int main(int argc, const char **argv)
{
try {
std::string env_ipath;
std::string opt_ipath;
std::string ipath;
std::string opt_ppath;
std::string dirname;
std::string filename;
unsigned opt_first = 1;
unsigned opt_last = 500;
unsigned opt_step = 1;
bool opt_click_allowed = true;
bool opt_display = true;
#if VISP_HAVE_DATASET_VERSION >= 0x030600
std::string ext("png");
#else
std::string ext("pgm");
#endif
if (!env_ipath.empty())
ipath = env_ipath;
if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_first, opt_last, opt_step, opt_click_allowed,
opt_display) == false) {
return EXIT_FAILURE;
}
if (!opt_ipath.empty())
ipath = opt_ipath;
if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
if (ipath != env_ipath) {
std::cout << std::endl << "WARNING: " << std::endl;
std::cout << " Since -i <visp image path=" << ipath << "> "
<< " is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
<< " we skip the environment variable." << std::endl;
}
}
if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty()) {
usage(argv[0], nullptr, ipath, opt_ppath, opt_first, opt_last, opt_step);
std::cerr << std::endl << "ERROR:" << std::endl;
std::cerr << " Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
<< " environment variable to specify the location of the " << std::endl
<< " image path where test images are located." << std::endl
<< " Use -p <personal image path> option if you want to " << std::endl
<< " use personal images." << std::endl
<< std::endl;
return EXIT_FAILURE;
}
cv::Mat cvI;
unsigned iter = opt_first;
std::ostringstream s;
char cfilename[FILENAME_MAX];
if (opt_ppath.empty()) {
s.setf(std::ios::right, std::ios::adjustfield);
s << "image." << std::setw(4) << std::setfill('0') << iter << "." << ext;
}
else {
snprintf(cfilename, FILENAME_MAX, opt_ppath.c_str(), iter);
filename = cfilename;
}
try {
std::cout << "Load: " << filename << std::endl;
}
catch (...) {
std::cerr << std::endl << "ERROR:" << std::endl;
std::cerr << " Cannot read " << filename << std::endl;
if (opt_ppath.empty()) {
std::cerr << " Check your -i " << ipath << " option " << std::endl
<< " or VISP_INPUT_IMAGE_PATH environment variable." << std::endl;
}
else {
std::cerr << " Check your -p " << opt_ppath << " option " << std::endl;
}
return EXIT_FAILURE;
}
#if defined(VISP_HAVE_X11)
#elif defined(VISP_HAVE_GTK)
#elif defined(VISP_HAVE_GDI)
#elif defined(HAVE_OPENCV_HIGHGUI)
#endif
if (opt_display) {
display.init(vpI, 100, 100, "Display...");
}
if (opt_display) {
}
while (iter < opt_last) {
if (opt_ppath.empty()) {
s.str("");
s << "image." << std::setw(4) << std::setfill('0') << iter << "." << ext;
}
else {
snprintf(cfilename, FILENAME_MAX, opt_ppath.c_str(), iter);
filename = cfilename;
}
if (opt_display) {
}
std::cout << "Tracking on image: " << filename << std::endl;
if (opt_display) {
}
iter += opt_step;
}
if (opt_display && opt_click_allowed) {
std::cout << "\nA click to exit..." << std::endl;
}
return EXIT_SUCCESS;
}
std::cout << "Catch an exception: " << e << std::endl;
return EXIT_FAILURE;
}
}
#else
int main()
{
std::cout << "You do not have OpenCV functionalities to display images..." << std::endl;
std::cout << "Tip:" << std::endl;
std::cout << "- Install OpenCV, configure again ViSP using cmake and build again this example" << std::endl;
return EXIT_SUCCESS;
}
#endif
#else
#include <iostream>
int main()
{
std::cout << "visp_klt module or X11, GTK, GDI or OpenCV display "
"functionalities are required..."
<< std::endl;
}
#endif
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 display(const vpImage< unsigned char > &I, const vpColor &color=vpColor::red, unsigned int thickness=1) const
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 setUseHarris(int useHarrisDetector)
void setWindowSize(int winSize)
void setPyramidLevels(int pyrMaxLevel)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
VISP_EXPORT double measureTimeMs()