Использование SIFT в opencv с использованием c++ без специальных библиотек

Основываясь на таких источниках, как это, кажется, что единственный способ, которым люди используют SIFT, — это библиотека.

#include <opencv2/nonfree/features2d.hpp>

которым я не умею пользоваться. Я не нашел никаких источников, говорящих о том, что в С++ opencv есть другие варианты

Кто-нибудь знает способ извлечения SIFT без этой библиотеки?

Я пытался использовать эту библиотеку, включенную в opencv.

#include <opencv2/features2d.hpp>

который согласно https://docs.opencv.org/4.x/d7/d60/classcv_1_1SIFT.html должен содержать необходимые функции SIFT

const cv::Mat input = cv::imread("my/file/path", 0); //Load as grayscale

        cv::SiftFeatureDetector detector;
        std::vector<cv::KeyPoint> keypoints;
        detector.detect(input, keypoints);

        // Add results to image and save.
        cv::Mat output;
        cv::drawKeypoints(input, keypoints, output);
        for (int i = 0; i < 100; i++) {
            imshow(window_name, output);
            waitKey(50);
        }

но когда я запускаю это, я получаю исключение, которое, вероятно, означает, что для начала ничего не сохраняется в выходной матрице.

Unhandled exception at 0x00007FFFF808FE7C in CS4391_Project1.exe: Microsoft C++ exception: cv::Exception at memory location 0x00000008C15CF5C0.

Разве просеивание не было переведено из несвободного в бесплатное после окончания действия патента?

Micka 06.04.2023 06:07

@Micka да - я приложил ссылку из opencv, в которой говорится, что когда я использую библиотеку, которую они предлагают бесплатно, мой код не работает, и мне интересно, почему

cvstudent 06.04.2023 06:19

Какую версию opencv вы используете? cv::getBuildEnvironment()

Micka 06.04.2023 07:18

Я не думаю, что исключение вызвано использованием вами просеивания, для этого нет никаких указаний. Для начала предлагаю вам создать минимальный воспроизводимый пример . Запустите этот код в отладчике, чтобы проверить, что он делает. Как новый пользователь здесь, также пройдите тур и прочитайте Как спросить.

Ulrich Eckhardt 06.04.2023 09:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько я знаю, OpenCV ожидает, что вы создадите детектор признаков динамически. Например, вы можете сделать что-то вроде этого:

#include <opencv2/features2d.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

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

    if (argc != 2) {
        std::cerr << "Usage; sift <imagefile>\n";
        return EXIT_FAILURE;
    }
   
    const int feature_count = 10; // number of features to find

    const cv::Mat input = cv::imread(argv[1], 0);

    cv::Ptr<cv::SiftFeatureDetector> detector =
        cv::SiftFeatureDetector::create(feature_count);
    std::vector<cv::KeyPoint> keypoints;
    detector->detect(input, keypoints);

    std::string window_name = "main";

    cv::namedWindow(window_name);

    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imshow(window_name, output);
    cv::waitKey(0);
}

[Проверено на Ubuntu с OpenCV 4.5.4]

Обратите внимание: несмотря на то, что обнаруженные объекты будут выделены цветом на изображении в градациях серого, иногда они бывают довольно маленькими, поэтому вам нужно внимательно посмотреть, чтобы найти их.

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