37#include <visp3/core/vpConfig.h>
39#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_FEATURES2D) && defined(HAVE_OPENCV_VIDEO)
41#include <visp3/core/vpImage.h>
42#include <visp3/core/vpIoTools.h>
43#include <visp3/gui/vpDisplayGDI.h>
44#include <visp3/gui/vpDisplayGTK.h>
45#include <visp3/gui/vpDisplayOpenCV.h>
46#include <visp3/gui/vpDisplayX.h>
47#include <visp3/io/vpImageIo.h>
48#include <visp3/io/vpParseArgv.h>
49#include <visp3/vision/vpKeyPoint.h>
52#define GETOPTARGS "cdh"
54void usage(
const char *name,
const char *badparam);
55bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display);
65void usage(
const char *name,
const char *badparam)
68Test keypoints detection.\n\
78 Disable the mouse click. Useful to automate the \n\
79 execution of this program without human intervention.\n\
82 Turn off the display.\n\
88 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
102bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display)
110 click_allowed =
false;
116 usage(argv[0], NULL);
121 usage(argv[0], optarg_);
127 if ((c == 1) || (c == -1)) {
129 usage(argv[0], NULL);
130 std::cerr <<
"ERROR: " << std::endl;
131 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
138template <
typename Type>
139void run_test(
const std::string &env_ipath,
bool opt_click_allowed,
bool opt_display,
vpImage<Type> &Iinput,
150#if defined(VISP_HAVE_X11)
152#elif defined(VISP_HAVE_GTK)
154#elif defined(VISP_HAVE_GDI)
156#elif defined(HAVE_OPENCV_HIGHGUI)
161 display.init(I, 0, 0,
"KeyPoints detection.");
166 std::cout <<
"INFORMATION: " << std::endl;
167 std::cout <<
"Here, we want to test feature detection on a pyramid of images even for features "
168 "that are scale invariant to detect potential problem in ViSP."
175 std::vector<std::string> detectorNames;
176 detectorNames.push_back(
"PyramidFAST");
177 detectorNames.push_back(
"FAST");
178 detectorNames.push_back(
"PyramidMSER");
179 detectorNames.push_back(
"MSER");
180 detectorNames.push_back(
"PyramidGFTT");
181 detectorNames.push_back(
"GFTT");
182 detectorNames.push_back(
"PyramidSimpleBlob");
183 detectorNames.push_back(
"SimpleBlob");
185#if (VISP_HAVE_OPENCV_VERSION < 0x030000) || defined(VISP_HAVE_OPENCV_XFEATURES2D)
186 detectorNames.push_back(
"PyramidSTAR");
187 detectorNames.push_back(
"STAR");
189#if (VISP_HAVE_OPENCV_VERSION >= 0x030000)
190 detectorNames.push_back(
"PyramidAGAST");
191 detectorNames.push_back(
"AGAST");
193 detectorNames.push_back(
"PyramidORB");
194 detectorNames.push_back(
"ORB");
195#if (VISP_HAVE_OPENCV_VERSION >= 0x020403)
196 detectorNames.push_back(
"PyramidBRISK");
197 detectorNames.push_back(
"BRISK");
199#if (VISP_HAVE_OPENCV_VERSION >= 0x030000)
200 detectorNames.push_back(
"PyramidKAZE");
201 detectorNames.push_back(
"KAZE");
202 detectorNames.push_back(
"PyramidAKAZE");
203 detectorNames.push_back(
"AKAZE");
206#if defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D) || \
207 (VISP_HAVE_OPENCV_VERSION >= 0x030411 && CV_MAJOR_VERSION < 4) || (VISP_HAVE_OPENCV_VERSION >= 0x040400)
208#if (VISP_HAVE_OPENCV_VERSION != 0x040504) && (VISP_HAVE_OPENCV_VERSION != 0x040505) && \
209 (VISP_HAVE_OPENCV_VERSION != 0x040600) && (VISP_HAVE_OPENCV_VERSION != 0x040700) && \
210 (defined(__APPLE__) && defined(__MACH__))
214 detectorNames.push_back(
"PyramidSIFT");
215 detectorNames.push_back(
"SIFT");
218#if defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D)
219 detectorNames.push_back(
"PyramidSURF");
220 detectorNames.push_back(
"SURF");
223 for (std::vector<std::string>::const_iterator itd = detectorNames.begin(); itd != detectorNames.end(); ++itd) {
226 std::vector<cv::KeyPoint> kpts;
228 keyPoints.
detect(I, kpts);
229 std::cout <<
"Nb keypoints detected: " << kpts.size() <<
" for " << *itd <<
" method." << std::endl;
231 std::stringstream ss;
232 ss <<
"No keypoints detected with " << *itd <<
" and image: " << filename <<
"." << std::endl;
239 for (std::vector<cv::KeyPoint>::const_iterator it = kpts.begin(); it != kpts.end(); ++it) {
241 imPt.
set_uv(it->pt.x, it->pt.y);
248 if (opt_click_allowed) {
256 std::map<vpKeyPoint::vpFeatureDetectorType, std::string> mapOfDetectorNames = keyPoints.
getDetectorNames();
258#if defined(VISP_HAVE_OPENCV_NONFREE) || defined(VISP_HAVE_OPENCV_XFEATURES2D) || \
259 (VISP_HAVE_OPENCV_VERSION >= 0x030411 && CV_MAJOR_VERSION < 4) || (VISP_HAVE_OPENCV_VERSION >= 0x040400)
260#if ((VISP_HAVE_OPENCV_VERSION == 0x040504) || (VISP_HAVE_OPENCV_VERSION == 0x040505) || \
261 (VISP_HAVE_OPENCV_VERSION == 0x040600) || (VISP_HAVE_OPENCV_VERSION == 0x040700)) && \
262 (defined(__APPLE__) && defined(__MACH__))
273 std::vector<cv::KeyPoint> kpts;
275 keyPoints.
detect(I, kpts);
276 std::cout <<
"Nb keypoints detected: " << kpts.size() <<
" for "
279 std::stringstream ss;
281 <<
" method and image: " << filename <<
"." << std::endl;
288 for (std::vector<cv::KeyPoint>::const_iterator it = kpts.begin(); it != kpts.end(); ++it) {
290 imPt.
set_uv(it->pt.x, it->pt.y);
297 if (opt_click_allowed) {
310int main(
int argc,
const char **argv)
313 std::string env_ipath;
314 bool opt_click_allowed =
true;
315 bool opt_display =
true;
318 if (getOptions(argc, argv, opt_click_allowed, opt_display) ==
false) {
326 if (env_ipath.empty()) {
327 std::cerr <<
"Please set the VISP_INPUT_IMAGE_PATH environment "
336 std::cout <<
"-- Test on gray level images" << std::endl;
337 run_test(env_ipath, opt_click_allowed, opt_display, Iinput, I);
343 std::cout <<
"-- Test on color images" << std::endl;
344 run_test(env_ipath, opt_click_allowed, opt_display, Iinput, I);
348 std::cerr << e.
what() << std::endl;
352 std::cout <<
"testKeyPoint-5 is ok !" << std::endl;
360 std::cerr <<
"You need OpenCV library." << std::endl;
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 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...
void detect(const vpImage< unsigned char > &I, std::vector< cv::KeyPoint > &keyPoints, const vpRect &rectangle=vpRect())
std::map< vpFeatureDetectorType, std::string > getDetectorNames() const
void setDetector(const vpFeatureDetectorType &detectorType)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)