在 OpenCv 3.2 中使用 ORB、Fast、Brsik 等特征描述符

Using featuredescriptors like ORB, Fast, Brsik with OpenCv 3.2

我对 OpenCV 很陌生。我按照 this tutorial 在图片中搜索对象,我能够 运行 代码成功。

在搜索时,我看到有 more options 用于特征匹配(例如 FastORBBRISK)。所以我决定尝试使用不同于 SURF.

的描述符

但我遇到了麻烦。我需要做什么才能创建不同的描述符?有人可以帮助我,也许可以提供 OpenCV3.2 的代码示例吗? :)

这是我在搜索时找到的 link,但遗憾的是它不是 OpenCV 3.2

OpenCV 3 引入了一致的特征检测API。

也就是说,每个特征检测器都实现了一个静态的 create() 方法,该方法 returns 一个 cv::Ptr 到相应的检测器。

这是一个简单的示例,它显示了所描述的行为:

#include <iostream>
#include <vector>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>


int main(int argc, char *argv[])
{
    if(argc > 1) {
        cv::Mat img = cv::imread(argv[1], cv::ImreadModes::IMREAD_GRAYSCALE);
        if(!img.empty()) {
            cv::Ptr<cv::xfeatures2d::SiftFeatureDetector> siftDetector = cv::xfeatures2d::SiftFeatureDetector::create();
            cv::Ptr<cv::BRISK> briskDetector = cv::BRISK::create();

            std::vector<cv::KeyPoint> siftKeypoints;
            std::vector<cv::KeyPoint> briskKeypoints;

            siftDetector->detect(img, siftKeypoints);
            briskDetector->detect(img, briskKeypoints);

            std::cout << "Detected " << siftKeypoints.size() << " SIFT keypoints." << std::endl;
            std::cout << "Detected " << briskKeypoints.size() << " BRISK keypoints." << std::endl;
            return 0;
        } else {
            std::cout << "Unable to load image, aborting." << std::endl;
            return -1;
        }
    }
    std::cout << "A path to an (image) file is missing." << std::endl;
    return -1;
}

按照这个示例,您可以使用最新文档中的每个 OpenCV 检测器:

Default descriptors

Non-free descriptors

Experimental descriptors