Использование функциональных дескрипторов, таких как ORB, Fast, Brsik с OpenCv 3.2

Я новичок в OpenCV, Я следовал этому руководству для поиска объекта на картинке и смог успешно выполнить код.

Пока я искал, я увидел, что есть больше вариантов для соответствия функций (например, Fast, ORB или же BRISK). Поэтому я решил попробовать другой дескриптор, чем SURF,

Но у меня проблемы. Что мне нужно сделать, чтобы создать другой дескриптор? Может кто-нибудь помочь мне, может быть, с примером кода для OpenCV3.2?:)

Это ссылка, которую я нашел при поиске, но, к сожалению, это не для OpenCV 3.2,

1 ответ

Решение

С 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, которые есть в последних документах:

Дескрипторы по умолчанию

Несвободные дескрипторы

Экспериментальные дескрипторы

Другие вопросы по тегам