OpenCV SURF功能未实现

时间:2012-06-24 07:37:48

标签: c++ visual-c++ opencv implementation surf

当我尝试运行示例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然后再使用VS2011再次构建OpenCV 2.4,然后在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 个答案:

答案 0 :(得分:10)

取自this answer(你为什么不在问之前谷歌你的问题?):

SIFT和SURF代码在OpenCV v2.4中移动到一个名为的新模块 nonfree。确保链接(Windlow中的DLL)。在linux中,这个库名为libopencv_nonfree.so

答案 1 :(得分:8)

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

    #include <opencv2/nonfree/nonfree.hpp> 
    ... 
    cv::initModule_nonfree();

答案 2 :(得分:3)

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

答案 3 :(得分:0)

对于ubuntu脚本来说 https://help.ubuntu.com/community/OpenCV 可以通过添加

来修改非自由冲浪/筛选使用

libopencv_nonfree

到sudo apt-get命令的结尾,

-D BUILD_opencv_nonfree = ON

到cmake命令的末尾。在卸载了我从软件中心处理opencv的所有内容之后,它才对我有用。顺便提一下,软件中心还有一个opencv非自由库,&#34; libopencv-nonfree2.4&#34;这似乎没有帮助。 我不是这方面的专家,所以我不知道我所做的是100%正确,但它允许诸如

之类的命令

surf = cv2.SURF(400)

keypoints = surfDetector.detect(im)

运行之前没有(第一个导致&#39;未找到&#39;类型错误,而第二个导致段错误。)

opencv.sh的版本允许我使用粘贴到http://pastebin.com/sQzDdx5i的非自由冲浪/筛选 现在正在运行的版本是opencv-2.4.9但可能这适用于其他版本,因为脚本似乎与lib名称有些不可知。