44 #include <visp3/core/vpConfig.h>
46 #if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_FEATURES2D)
48 #include <opencv2/features2d/features2d.hpp>
50 #include <visp3/core/vpImage.h>
51 #include <visp3/core/vpIoTools.h>
52 #include <visp3/gui/vpDisplayGDI.h>
53 #include <visp3/gui/vpDisplayGTK.h>
54 #include <visp3/gui/vpDisplayOpenCV.h>
55 #include <visp3/gui/vpDisplayX.h>
56 #include <visp3/io/vpImageIo.h>
57 #include <visp3/io/vpParseArgv.h>
58 #include <visp3/io/vpVideoReader.h>
61 #define GETOPTARGS "cdh"
63 #ifdef ENABLE_VISP_NAMESPACE
67 void usage(
const char *name,
const char *badparam);
68 bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display);
77 void usage(
const char *name,
const char *badparam)
80 Test keypoints matching.\n\
90 Disable the mouse click. Useful to automate the \n\
91 execution of this program without human intervention.\n\
94 Turn off the display.\n\
100 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
114 bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display)
122 click_allowed =
false;
128 usage(argv[0],
nullptr);
133 usage(argv[0], optarg_);
139 if ((c == 1) || (c == -1)) {
141 usage(argv[0],
nullptr);
142 std::cerr <<
"ERROR: " << std::endl;
143 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
150 template <
typename Type>
151 void run_test(
const std::string &env_ipath,
bool opt_click_allowed,
bool opt_display,
vpImage<Type> &Iref,
154 #if VISP_HAVE_DATASET_VERSION >= 0x030600
155 std::string ext(
"png");
157 std::string ext(
"pgm");
168 cv::Ptr<cv::FeatureDetector> detector;
169 cv::Ptr<cv::DescriptorExtractor> extractor;
170 cv::Ptr<cv::DescriptorMatcher> matcher;
172 #if (VISP_HAVE_OPENCV_VERSION >= 0x030000)
173 detector = cv::ORB::create();
174 extractor = cv::ORB::create();
176 detector = cv::FeatureDetector::create(
"ORB");
177 extractor = cv::DescriptorExtractor::create(
"ORB");
179 matcher = cv::DescriptorMatcher::create(
"BruteForce-Hamming");
181 std::vector<cv::KeyPoint> trainKeyPoints;
182 cv::Mat matImg, trainDescriptors;
184 detector->detect(matImg, trainKeyPoints);
185 extractor->compute(matImg, trainKeyPoints, trainDescriptors);
195 #if defined(VISP_HAVE_X11)
197 #elif defined(VISP_HAVE_GTK)
199 #elif defined(VISP_HAVE_GDI)
201 #elif defined(HAVE_OPENCV_HIGHGUI)
207 display.init(Imatch, 0, 0,
"ORB keypoints matching");
210 bool opt_click =
false;
221 std::vector<cv::KeyPoint> queryKeyPoints;
222 detector->detect(matImg, queryKeyPoints);
224 cv::Mat queryDescriptors;
225 extractor->compute(matImg, queryKeyPoints, queryDescriptors);
227 std::vector<std::vector<cv::DMatch> > knn_matches;
228 std::vector<cv::DMatch> matches;
229 matcher->knnMatch(queryDescriptors, trainDescriptors, knn_matches, 2);
230 for (std::vector<std::vector<cv::DMatch> >::const_iterator it = knn_matches.begin(); it != knn_matches.end();
232 if (it->size() > 1) {
233 double ratio = (*it)[0].distance / (*it)[1].distance;
235 matches.push_back((*it)[0]);
241 for (std::vector<cv::DMatch>::const_iterator it = matches.begin(); it != matches.end(); ++it) {
242 vpImagePoint leftPt(trainKeyPoints[(
size_t)it->trainIdx].pt.y, trainKeyPoints[(
size_t)it->trainIdx].pt.x);
243 vpImagePoint rightPt(queryKeyPoints[(
size_t)it->queryIdx].pt.y,
244 queryKeyPoints[(
size_t)it->queryIdx].pt.x + Iref.
getWidth());
252 if (opt_click_allowed && opt_display) {
274 int main(
int argc,
const char **argv)
277 std::string env_ipath;
278 bool opt_click_allowed =
true;
279 bool opt_display =
true;
282 if (getOptions(argc, argv, opt_click_allowed, opt_display) ==
false) {
290 if (env_ipath.empty()) {
291 std::cerr <<
"Please set the VISP_INPUT_IMAGE_PATH environment "
300 std::cout <<
"-- Test on gray level images" << std::endl;
301 run_test(env_ipath, opt_click_allowed, opt_display, Iref, Icur, Imatch);
307 std::cout <<
"-- Test on color images" << std::endl;
308 run_test(env_ipath, opt_click_allowed, opt_display, Iref, Icur, Imatch);
313 std::cerr << e.
what() << std::endl;
317 std::cout <<
"testKeyPoint-3 is ok !" << std::endl;
324 std::cerr <<
"You need OpenCV library." << std::endl;
static const vpColor green
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 displayLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1, bool segment=true)
static void flush(const vpImage< unsigned char > &I)
error that can be emitted by ViSP classes.
const char * what() const
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)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition of the vpImage class member functions.
unsigned int getWidth() const
void resize(unsigned int h, unsigned int w)
resize the image : Image initialization
void insert(const vpImage< Type > &src, const vpImagePoint &topLeft)
unsigned int getHeight() const
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Class that enables to manipulate easily a video file or a sequence of images. As it inherits from the...
void acquire(vpImage< vpRGBa > &I)
void open(vpImage< vpRGBa > &I)
void setFileName(const std::string &filename)