Test descriptor extraction.
#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 keypoint descriptor extraction.\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;
}
std::string getOpenCVType(int type)
{
std::string type_string = "";
switch (type) {
case CV_8U:
type_string = "CV_8U";
break;
case CV_8S:
type_string = "CV_8S";
break;
case CV_16U:
type_string = "CV_16U";
break;
case CV_16S:
type_string = "CV_16S";
break;
case CV_32S:
type_string = "CV_32S";
break;
case CV_32F:
type_string = "CV_32F";
break;
case CV_64F:
type_string = "CV_64F";
break;
default:
type_string = "Problem with type !";
break;
}
return type_string;
}
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::vector<std::string> descriptorNames;
#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)
descriptorNames.push_back("SIFT");
#endif
#if defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D)
descriptorNames.push_back("SURF");
#endif
descriptorNames.push_back("ORB");
#if (VISP_HAVE_OPENCV_VERSION >= 0x020403)
descriptorNames.push_back("BRISK");
#endif
#if defined(VISP_HAVE_OPENCV_XFEATURES2D) || (VISP_HAVE_OPENCV_VERSION < 0x030000)
descriptorNames.push_back("BRIEF");
#if (VISP_HAVE_OPENCV_VERSION >= 0x020402)
descriptorNames.push_back("FREAK");
#endif
#endif
#if defined(VISP_HAVE_OPENCV_XFEATURES2D)
descriptorNames.push_back("DAISY");
descriptorNames.push_back("LATCH");
#endif
#if (VISP_HAVE_OPENCV_VERSION >= 0x030200) && defined(VISP_HAVE_OPENCV_XFEATURES2D)
descriptorNames.push_back("VGG");
descriptorNames.push_back("BoostDesc");
#endif
#if (VISP_HAVE_OPENCV_VERSION >= 0x030000)
descriptorNames.push_back("KAZE");
descriptorNames.push_back("AKAZE");
#endif
std::string detectorName = "FAST";
std::vector<cv::KeyPoint> kpts;
std::cout << "Nb keypoints detected: " << kpts.size() << " for " << detectorName << " method." << std::endl;
if (kpts.empty()) {
std::stringstream ss;
ss << "No keypoints detected with " << detectorName << " and image:" << filename << "." << std::endl;
}
for (std::vector<std::string>::const_iterator itd = descriptorNames.begin(); itd != descriptorNames.end(); ++itd) {
if (*itd == "KAZE") {
detectorName = "KAZE";
std::cout << "Nb keypoints detected: " << kpts.size() << " for " << detectorName << " method." << std::endl;
if (kpts.empty()) {
std::stringstream ss;
ss << "No keypoints detected with " << detectorName << " and image:" << filename << "." << std::endl;
}
}
else if (*itd == "AKAZE") {
detectorName = "AKAZE";
std::cout << "Nb keypoints detected: " << kpts.size() << " for " << detectorName << " method." << std::endl;
if (kpts.empty()) {
std::stringstream ss;
ss << "No keypoints detected with " << detectorName << " and image:" << filename << "." << std::endl;
}
}
else if (*itd == "BoostDesc") {
#if (VISP_HAVE_OPENCV_VERSION >= 0x030200) && defined(VISP_HAVE_OPENCV_XFEATURES2D)
cv::Ptr<cv::Feature2D> boostDesc = keyPoints.
getExtractor(
"BoostDesc");
boostDesc = cv::xfeatures2d::BoostDesc::create(cv::xfeatures2d::BoostDesc::BINBOOST_256, true, 5.0f);
#endif
}
cv::Mat descriptor;
keyPoints.
extract(I, kpts, descriptor);
std::cout << "Descriptor: " << descriptor.rows << "x" << descriptor.cols
<< " (rows x cols) ; type=" << getOpenCVType(descriptor.type()) << " for " << *itd << " method in " << t
<< " ms." << std::endl;
if (descriptor.empty()) {
std::stringstream ss;
ss << "No descriptor extracted 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::vpFeatureDescriptorType, std::string> mapOfDescriptorNames = keyPoints.
getExtractorNames();
detectorName = "KAZE";
std::cout << "Nb keypoints detected: " << kpts.size() << " for " << detectorName << " method." << std::endl;
if (kpts.empty()) {
std::stringstream ss;
ss << "No keypoints detected with " << detectorName << " and image:" << filename << "." << std::endl;
}
}
detectorName = "AKAZE";
std::cout << "Nb keypoints detected: " << kpts.size() << " for " << detectorName << " method." << std::endl;
if (kpts.empty()) {
std::stringstream ss;
ss << "No keypoints detected with " << detectorName << " and image:" << filename << "." << std::endl;
}
}
#if (VISP_HAVE_OPENCV_VERSION >= 0x030200) && defined(VISP_HAVE_OPENCV_XFEATURES2D)
detectorName = "FAST";
std::cout << "Nb keypoints detected: " << kpts.size() << " for " << detectorName << " method." << std::endl;
if (kpts.empty()) {
std::stringstream ss;
ss << "No keypoints detected with " << detectorName << " and image:" << filename << "." << std::endl;
}
cv::Ptr<cv::Feature2D> boostDesc = keyPoints.
getExtractor(
"BoostDesc");
boostDesc = cv::xfeatures2d::BoostDesc::create(cv::xfeatures2d::BoostDesc::BINBOOST_256, true, 5.0f);
#endif
}
cv::Mat descriptor;
keyPoints.
extract(I, kpts, descriptor);
std::cout << "Descriptor: " << descriptor.rows << "x" << descriptor.cols
<< " (rows x cols) ; type=" << getOpenCVType(descriptor.type()) << " for "
<< std::endl;
if (descriptor.empty()) {
std::stringstream ss;
<< " 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-6 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 quarterSizeImage(vpImage< Type > &res) const
Class that allows keypoints detection (and descriptors extraction) and matching thanks to OpenCV libr...
void setExtractor(const vpFeatureDescriptorType &extractorType)
void extract(const vpImage< unsigned char > &I, std::vector< cv::KeyPoint > &keyPoints, cv::Mat &descriptors, std::vector< cv::Point3f > *trainPoints=nullptr)
void detect(const vpImage< unsigned char > &I, std::vector< cv::KeyPoint > &keyPoints, const vpRect &rectangle=vpRect())
@ DESCRIPTOR_TYPE_SIZE
Number of descriptors available.
std::map< vpFeatureDescriptorType, std::string > getExtractorNames() const
void setDetector(const vpFeatureDetectorType &detectorType)
cv::Ptr< cv::DescriptorExtractor > getExtractor(const vpFeatureDescriptorType &type) const
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
VISP_EXPORT double measureTimeMs()