C ++ - SiftFeatureDetector未加载

时间:2017-05-20 02:52:47

标签: c++ opencv sift

我目前正在尝试使用OpenCV的SiftFeatureDetector。但是,这发生了: Click This Link For Image

我看到我需要非自由文件。这是我从以下地方获取文件的地方:

features2d.hpp: sourceforge.net/p/emgucv/opencv/ci/3ad471d9c187b6509ca4aab439290bc76c7a258f/tree/modules/nonfree/include/opencv2/nonfree/features2d.hpp

nonfree.hpp: sourceforge.net/p/emgucv/opencv/ci/3ad471d9c187b6509ca4aab439290bc76c7a258f/tree/modules/nonfree/include/opencv2/nonfree/nonfree.hpp

这是我的进口: Click This Link For Image

有人可以告诉我这是什么问题吗?

1 个答案:

答案 0 :(得分:3)

您正在从EmguCV网站获取文件。 EmguCV是为.net框架开发的OpenCV的包装器。如果您要将OpenCV与c ++一起使用,那么您应该使用可从以下网址下载的OpenCV库和头文件:http://opencv.org

似乎SIFT从版本3.0移出了OpenCV的默认安装。所以答案取决于您使用的OpenCV版本。

注意:如果您不想为自己构建OpenCV而烦恼,则应考虑使用2.4.13.2或小于3.0的版本。

使用Visual Studio 2015在Windows 10上测试。

OpenCV 2.4.13.2

您可以从此link下载预建库。预建库包括SIFT。 (在我的情况下,因为我在Windows上,我已经使用过opencv-2.4.13.2-vc14.exe)你可以像下面的代码一样使用SIFT。

#include <opencv2/opencv.hpp>
#include <opencv2/nonfree/features2d.hpp>

int main(int argc, const char* argv[])
{
    const cv::Mat input = cv::imread("D:/lenna.png", 0); //Load as grayscale

    // Detect
    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);
    cv::imwrite("D:/lenna_sift.jpg", output);

    return 0;
}

original image / feature detected image

(从here复制了这个最小的例子)

OpenCV 3.2

您可以从this link下载此版本的预建库,但此版本不包含SIFT作为默认安装功能。 (我已经检查了opencv-3.2.0-vc14.exe并且它没有它)似乎OpenCV社区决定从版本3.0开始从默认安装中删除SIFT和SURF等专利算法({ {3}})。要使用这些,您必须下载link opencv源代码并自行构建库。您必须配置构建设置,以便可以在启用SIFT的情况下构建。然后你可以像下面那样做SIFT。

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>

int main(int argc, const char* argv[])
{
    const cv::Mat input = cv::imread("D:/lenna.png", 0); //Load as grayscale

    // Detect
    cv::Ptr<cv::Feature2D> f2d = cv::xfeatures2d::SiftFeatureDetector::create();
    std::vector<cv::KeyPoint> keypoints;
    f2d->detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("D:/lenna_sift.jpg", output);

    return 0;
}

opencv_contrib / original image

我希望在3.02.4.13.2之前使用SIFT与其他版本相同,并且3.0之后和之后的版本与3.2相同。如果不是,请告诉我,以便我可以改进这篇文章。