我目前正在尝试使用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
有人可以告诉我这是什么问题吗?
答案 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上测试。
您可以从此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复制了这个最小的例子)
您可以从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.0
与2.4.13.2
之前使用SIFT与其他版本相同,并且3.0
之后和之后的版本与3.2
相同。如果不是,请告诉我,以便我可以改进这篇文章。