使用C++在OpenCV中使用SIFT,无需特殊库

6qfn3psc  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(142)

根据this等来源,人们使用SIFT的唯一方式似乎是使用库

#include <opencv2/nonfree/features2d.hpp>

我没有找到任何来源说在c++ 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.
avwztpqn

avwztpqn1#

据我所知,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]
请注意,尽管它检测到的特征将在灰度图像上以彩色轮廓显示,但它们有时非常小,因此您需要仔细查看才能找到它们。

相关问题