10

当我尝试运行示例find_obj.cpp或任何 OpenCV SURF 程序时,我在执行代码时在命令提示符中收到以下错误。该项目构建时没有错误和警告。我正在使用 VS2011 beta、OpenCV 2.4 和 windows7。

错误信息:

OpenCV Error: The function/feature is not implemented < OpenCV was built without SURF support> in unknown function,file ..\..\..\src\opencv\modules\legacy\src\features2d.cpp, line 77

我尝试使用 Cmake 再次构建 OpenCV 2.4,然后在调试模式下使用 VS2011,然后在 IDE 中添加 lib 路径,但仍然没有结果。

我该如何解决?

    #include <opencv2/objdetect/objdetect.hpp>
    #include <opencv2/features2d/features2d.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/legacy/legacy.hpp>
    #include <opencv2/legacy/compat.hpp>
    #include <opencv2/flann/flann.hpp>
    #include <opencv2/calib3d/calib3d.hpp>
    #include <opencv2/nonfree/features2d.hpp>
    #include <opencv2/nonfree/nonfree.hpp>

using namespace std;
using namespace cv;
int main()
{
    cv::initModule_nonfree();//THIS LINE IS IMPORTANT   

   IplImage *image1 = cvLoadImage("C:\\SURF\\1.jpg"); 
    IplImage *image2 = cvLoadImage("C:\\SURF\\2.jpg");

    CvMemStorage* memoryBlock = cvCreateMemStorage();
    CvSeq* image1KeyPoints;
    CvSeq* image1Descriptors;
    CvSeq* image2KeyPoints;
    CvSeq* image2Descriptors;

    // Only values with a hessian greater than 500 are considered for keypoints
   CvSURFParams params = cvSURFParams(500, 1);
   cvExtractSURF(image1, 0, &image1KeyPoints, &image1Descriptors, memoryBlock, params);
   cvExtractSURF(image2, 0, &image2KeyPoints, &image2Descriptors, memoryBlock, params);

   return 0;
}
4

4 回答 4

10

取自这个答案(你为什么不在提问前用谷歌搜索你的问题?):

SIFT 和 SURF 代码在 OpenCV v2.4 中移动到一个名为 nonfree. 确保您正在链接(Windlows 中的 DLL)到它。在 linux 中,这个库被称为libopencv_nonfree.so.

于 2012-06-24T09:03:10.020 回答
8

这不是一个错误。SURF 位于非自由模块中。要使用它,您应该初始化非自由模块:

    #include <opencv2/nonfree/nonfree.hpp> 
    ... 
    cv::initModule_nonfree();
于 2013-12-11T01:30:10.727 回答
3

最近,我正在学习 SURF。对于这个问题,您可以将 opencv_nonfree240d.lib 和 opencv_nonfree240.lib 添加到项目的 lib 路径中。

于 2012-10-15T02:15:45.123 回答
0

对于 ubuntu, 可以通过添加来修改https://help.ubuntu.com/community/OpenCV上的脚本以 用于非自由 surf/sift 使用

libopencv_nonfree

到 sudo apt-get 命令的末尾,以及

-D BUILD_opencv_nonfree=ON

到 cmake 命令的末尾。只有在从软件中心卸载了我能找到的处理 opencv 的所有内容后,它才对我有用。顺便说一句,软件中心还有一个 opencv 非自由库,“libopencv-nonfree2.4”,这似乎没有帮助。我不是这类事情的专家,所以我不知道我所做的是否 100% 正确,但它允许执行以下命令

冲浪 = cv2.SURF(400)

关键点 = surfDetector.detect(im)

运行以前没有的(第一个导致“未找到”类型错误,而第二个导致段错误)。

允许我使用粘贴到http://pastebin.com/sQzDdx5i的非自由 surf/sift 的 opencv.sh
版本现在工作的版本是 opencv-2.4.9 但可能这适用于其他版本,因为脚本似乎像库名称一样有点不可知论。

于 2014-08-06T17:17:46.867 回答