Test keypoints detection with OpenCV, specially the Pyramid implementation feature missing in OpenCV 3.0.
#include <iostream>
#include <visp3/core/vpConfig.h>
#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_FEATURES2D) && 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/vision/vpKeyPoint.h>
#define GETOPTARGS "cdh"
#ifdef ENABLE_VISP_NAMESPACE
#endif
void usage(const char *name, const char *badparam);
bool getOptions(int argc, const char **argv, bool &click_allowed, bool &display);
void usage(const char *name, const char *badparam)
{
fprintf(stdout, "\n\
Test keypoints detection.\n\
\n\
SYNOPSIS\n\
%s [-c] [-d] [-h]\n",
name);
fprintf(stdout, "\n\
OPTIONS: \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");
if (badparam)
fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
}
bool getOptions(int argc, const char **argv, bool &click_allowed, bool &display)
{
const char *optarg_;
int c;
switch (c) {
case 'c':
click_allowed = false;
break;
case 'd':
display = false;
break;
case 'h':
usage(argv[0], nullptr);
return false;
break;
default:
usage(argv[0], optarg_);
return false;
break;
}
}
if ((c == 1) || (c == -1)) {
usage(argv[0], nullptr);
std::cerr << "ERROR: " << std::endl;
std::cerr << " Bad argument " << optarg_ << std::endl << std::endl;
return false;
}
return true;
}
template <typename Type>
void run_test(
const std::string &env_ipath,
bool opt_click_allowed,
bool opt_display,
vpImage<Type> &Iinput,
{
#if defined(VISP_HAVE_X11)
vpDisplayX display;
#elif defined(VISP_HAVE_GTK)
#elif defined(VISP_HAVE_GDI)
#elif defined(HAVE_OPENCV_HIGHGUI)
#endif
if (opt_display) {
display.init(I, 0, 0, "KeyPoints detection.");
}
std::cout << "INFORMATION: " << std::endl;
std::cout << "Here, we want to test feature detection on a pyramid of images even for features "
"that are scale invariant to detect potential problem in ViSP."
<< std::endl
<< std::endl;
std::vector<std::string> detectorNames;
detectorNames.push_back("PyramidFAST");
detectorNames.push_back("FAST");
detectorNames.push_back("PyramidMSER");
detectorNames.push_back("MSER");
detectorNames.push_back("PyramidGFTT");
detectorNames.push_back("GFTT");
detectorNames.push_back("PyramidSimpleBlob");
detectorNames.push_back("SimpleBlob");
#if (VISP_HAVE_OPENCV_VERSION < 0x030000) || defined(VISP_HAVE_OPENCV_XFEATURES2D)
detectorNames.push_back("PyramidSTAR");
detectorNames.push_back("STAR");
#endif
#if (VISP_HAVE_OPENCV_VERSION >= 0x030000)
detectorNames.push_back("PyramidAGAST");
detectorNames.push_back("AGAST");
#endif
detectorNames.push_back("PyramidORB");
detectorNames.push_back("ORB");
#if (VISP_HAVE_OPENCV_VERSION >= 0x020403)
detectorNames.push_back("PyramidBRISK");
detectorNames.push_back("BRISK");
#endif
#if (VISP_HAVE_OPENCV_VERSION >= 0x030000)
detectorNames.push_back("PyramidKAZE");
detectorNames.push_back("KAZE");
detectorNames.push_back("PyramidAKAZE");
detectorNames.push_back("AKAZE");
#endif
#if defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D) || \
(VISP_HAVE_OPENCV_VERSION >= 0x030411 && CV_MAJOR_VERSION < 4) || (VISP_HAVE_OPENCV_VERSION >= 0x040400)
#if (VISP_HAVE_OPENCV_VERSION != 0x040504) && (VISP_HAVE_OPENCV_VERSION != 0x040505) && \
(VISP_HAVE_OPENCV_VERSION != 0x040600) && (VISP_HAVE_OPENCV_VERSION != 0x040700) && \
(VISP_HAVE_OPENCV_VERSION != 0x040900) && (VISP_HAVE_OPENCV_VERSION != 0x040A00) && \
(defined(__APPLE__) && defined(__MACH__))
std::cout << "-- Add SIFT detector" << std::endl;
detectorNames.push_back("PyramidSIFT");
detectorNames.push_back("SIFT");
#endif
#endif
#if defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D)
detectorNames.push_back("PyramidSURF");
detectorNames.push_back("SURF");
#endif
for (std::vector<std::string>::const_iterator itd = detectorNames.begin(); itd != detectorNames.end(); ++itd) {
std::vector<cv::KeyPoint> kpts;
std::cout << "Nb keypoints detected: " << kpts.size() << " for " << *itd << " method." << std::endl;
if (kpts.empty()) {
std::stringstream ss;
ss << "No keypoints detected with " << *itd << " and image: " << filename << "." << std::endl;
}
if (opt_display) {
for (std::vector<cv::KeyPoint>::const_iterator it = kpts.begin(); it != kpts.end(); ++it) {
imPt.
set_uv(it->pt.x, it->pt.y);
}
if (opt_click_allowed) {
}
}
}
std::cout << "\n\n";
std::map<vpKeyPoint::vpFeatureDetectorType, std::string> mapOfDetectorNames = keyPoints.
getDetectorNames();
#if defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D) || \
(VISP_HAVE_OPENCV_VERSION >= 0x030411 && CV_MAJOR_VERSION < 4) || (VISP_HAVE_OPENCV_VERSION >= 0x040400)
#if ((VISP_HAVE_OPENCV_VERSION == 0x040504) || (VISP_HAVE_OPENCV_VERSION == 0x040505) || \
(VISP_HAVE_OPENCV_VERSION == 0x040600) || (VISP_HAVE_OPENCV_VERSION == 0x040700) || \
(VISP_HAVE_OPENCV_VERSION == 0x040900) || (VISP_HAVE_OPENCV_VERSION == 0x040A00)) && \
(defined(__APPLE__) && defined(__MACH__))
std::cout << "-- Skip SIFT detector" << std::endl;
continue;
}
#endif
#endif
std::vector<cv::KeyPoint> kpts;
std::cout << "Nb keypoints detected: " << kpts.size() << " for "
if (kpts.empty()) {
std::stringstream ss;
<< " method and image: " << filename << "." << std::endl;
}
if (opt_display) {
for (std::vector<cv::KeyPoint>::const_iterator it = kpts.begin(); it != kpts.end(); ++it) {
imPt.
set_uv(it->pt.x, it->pt.y);
}
if (opt_click_allowed) {
}
}
}
}
int main(int argc, const char **argv)
{
try {
std::string env_ipath;
bool opt_click_allowed = true;
bool opt_display = true;
if (getOptions(argc, argv, opt_click_allowed, opt_display) == false) {
exit(EXIT_FAILURE);
}
if (env_ipath.empty()) {
std::cerr << "Please set the VISP_INPUT_IMAGE_PATH environment "
"variable value."
<< std::endl;
return EXIT_FAILURE;
}
{
std::cout << "-- Test on gray level images" << std::endl;
run_test(env_ipath, opt_click_allowed, opt_display, Iinput, I);
}
{
std::cout << "-- Test on color images" << std::endl;
run_test(env_ipath, opt_click_allowed, opt_display, Iinput, I);
}
}
std::cerr << e.
what() << std::endl;
return EXIT_FAILURE;
}
std::cout << "testKeyPoint-5 is ok !" << std::endl;
return EXIT_SUCCESS;
}
#else
#include <cstdlib>
int main()
{
std::cerr << "You need OpenCV library." << std::endl;
return EXIT_SUCCESS;
}
#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...
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
static void flush(const vpImage< unsigned char > &I)
error that can be emitted by ViSP classes.
const char * what() const
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void set_uv(double u, double v)
Definition of the vpImage class member functions.
void halfSizeImage(vpImage< Type > &res) const
Class that allows keypoints detection (and descriptors extraction) and matching thanks to OpenCV libr...
@ DETECTOR_TYPE_SIZE
Number of detectors available.
@ DETECTOR_SIFT
SIFT detector.
std::map< vpFeatureDetectorType, std::string > getDetectorNames() const
void detect(const vpImage< unsigned char > &I, std::vector< cv::KeyPoint > &keyPoints, const vpRect &rectangle=vpRect())
void setDetector(const vpFeatureDetectorType &detectorType)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)