使用ORB,Fast,Brsik和OpenCv 3.2等功能描述符

时间:2017-03-24 11:55:09

标签: c++ performance opencv orb brisk

我对@RestController @RequestMapping(value="/foo/") public class Baz { @RequestMapping(value="bar/v1", method=RequestMethod.GET) public String doXyz() { } } 很新。我跟着this tutorial搜索图片中的对象,我能够成功运行代码。

在我搜索时,我发现功能匹配more options(例如OpenCVFastORB)。所以我决定尝试与BRISK不同的描述符。

但我遇到了麻烦。如何创建不同的描述符?有人可以帮我,也许有SURF的代码示例? :)

这是我在搜索时找到的link,但遗憾的是它不适用于OpenCV3.2

1 个答案:

答案 0 :(得分:2)

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

也就是说,每个特征检测器都实现一个静态create()方法,该方法将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