OpenCV - FAST + BRIEF: Как нарисовать ключевые точки с помощью DrawMatchesFlags :: DRAW_RICH_KEYPOINTS? - PullRequest
1 голос
/ 21 мая 2019

Я должен реализовать детектор функций, используя FAST + BRIEF (который является реализацией ORB вручную, если я правильно понимаю).

Итак, вот код, который у меня есть:

printf("Calculating FAST+BRIEF features...\n");

Ptr<FastFeatureDetector> FASTdetector = FastFeatureDetector::create();
Ptr<BriefDescriptorExtractor> BRIEFdescriptor = BriefDescriptorExtractor::create();
std::vector<cv::KeyPoint> FASTkeypoints_1, FASTkeypoints_2, FASTkeypoints_3;
Mat BRIEFdescriptors_1, BRIEFdescriptors_2, BRIEFdescriptors_3;

FASTdetector->detect(left08, FASTkeypoints_1);
FASTdetector->detect(right08, FASTkeypoints_2);
FASTdetector->detect(left10, FASTkeypoints_3);

BRIEFdescriptor->compute(left08, FASTkeypoints_1, BRIEFdescriptors_1);
BRIEFdescriptor->compute(right08, FASTkeypoints_2, BRIEFdescriptors_2);
BRIEFdescriptor->compute(left10, FASTkeypoints_3, BRIEFdescriptors_3);

Mat FAST_left08, FAST_right08, FAST_left10;

drawKeypoints(left08, FASTkeypoints_1, FAST_left08, FASTBRIEFfeatcol_YELLOW, DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imwrite("../Results/FASTBRIEF_left08.png", FAST_left08);
drawKeypoints(right08, FASTkeypoints_2, FAST_right08, FASTBRIEFfeatcol_YELLOW, DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imwrite("../Results/FASTBRIEF_right08.png", FAST_right08);
drawKeypoints(left10, FASTkeypoints_3, FAST_left10, FASTBRIEFfeatcol_YELLOW, DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imwrite("../Results/FASTBRIEF_left10.png", FAST_left10);
printf("FAST+BRIEF done. \n");

Код до сих пор работает отлично, однако я не получаю богатые ключевые точки, а стандартные.Если я правильно понимаю, это потому, что мне нужно каким-то образом сначала получить информацию дескриптора для ключевых точек, верно?

Я сделал ту же реализацию с SIFT, SURF и ORB до этого, но там я использую *Функция 1008 * напрямую, которая дает мне ключевые точки, где я могу рисовать с флагом DrawMatchesFlags::DRAW_RICH_KEYPOINTS.

1 Ответ

1 голос
/ 22 мая 2019

Я должен реализовать детектор функций, используя FAST + BRIEF (который является реализацией ORB вручную, если я правильно понимаю).

Да, это правильно.

Если я правильно понимаю, это потому, что мне нужно каким-то образом сначала получить информацию дескриптора для ключевых точек, верно?

Нет, ключевые точки обнаруживаются разными способами. Вы можете использовать SIFT, FAST, HarrisDetector, SURF и т. Д. только для обнаружения ключевых точек вначале. Кроме того, существуют разные способы описания обнаруженных ключевых точек (например, дескриптор вектора с плавающей запятой 128 битов для SIFT) и их последующего сопоставления.
Ключевая точка в OpenCV может быть описана различными атрибутами: углом, размером, октавой и т. Д. https://docs.opencv.org/3.4.2/d2/d29/classcv_1_1KeyPoint.html
Для SIFT каждый атрибут KeyPoint заполняется числом, которое впоследствии можно нарисовать во флаге DRAW_RICH_KEYPOINTS. Для FAST назначаются только стандартные значения для атрибутов, так что их ключевые точки могут быть нарисованы с упомянутым флагом, но размер, октава и угол не изменяются. Таким образом, каждая нарисованная KeyPoint выглядит одинаково.

Вот небольшой пример кода в качестве доказательства (я использую только функции ->detect):

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>  

int main(int argc, char** argv)
{

    // Load image
    cv::Mat img = cv::imread("MT189.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    if (!img.data) {
        std::cout << "Error reading image" << std::endl;
        return EXIT_FAILURE;
    }
    cv::Mat output;

    // Detect FAST keypoints
    std::vector<cv::KeyPoint> keypoints_fast, keypoints_sift;
    cv::Ptr<cv::FastFeatureDetector> fast = cv::FastFeatureDetector::create();
    fast->detect(img, keypoints_fast);
    for (size_t i = 0; i < 100; ++i) {
        std::cout << "FAST Keypoint #:" << i;
        std::cout << " Size " << keypoints_fast[i].size << " Angle " << keypoints_fast[i].angle << " Response " << keypoints_fast[i].response << " Octave " << keypoints_fast[i].octave << std::endl;
    }

    // Detect SIFT keypoints
    cv::Ptr<cv::xfeatures2d::SiftFeatureDetector> sift = cv::xfeatures2d::SiftFeatureDetector::create();
    sift->detect(img, keypoints_sift);

    for (size_t i = 0; i < 100; ++i) {
        std::cout << "SIFT Keypoint #:" << i;
        std::cout << " Size " << keypoints_sift[i].size << " Angle " << keypoints_sift[i].angle << " Response " << keypoints_sift[i].response << " Octave " << keypoints_sift[i].octave << std::endl;
    }

    // Draw SIFT keypoints
    cv::drawKeypoints(img, keypoints_sift, output, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    cv::imshow("Output", output);
    cv::waitKey(0);


}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...