在没有特殊库的情况下使用 c++ 在 opencv 中使用 SIFT

问题描述 投票:0回答:1

基于诸如 this 之类的资源,似乎人们使用 SIFT 的唯一方式是使用图书馆

#include <opencv2/nonfree/features2d.hpp>

我无法使用。我没有找到任何消息来源说 c++ opencv 中还有其他选项

有谁知道没有这个库就可以进行 SIFT 提取的方法吗?

我试过使用 opencv 中包含的这个库

#include

根据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.
c++ opencv sift
1个回答
0
投票

据我所知,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]

请注意,虽然它检测到的特征会在灰度图像上用颜色勾勒出轮廓,但它们有时非常小,因此您需要仔细观察才能找到它们。

© www.soinside.com 2019 - 2024. All rights reserved.