Функция OpenCV SURF не реализована

когда я пытаюсь запустить пример find_obj.cpp или любая программа OpenCV SURF я получаю следующую ошибку в командной строке при выполнении кода. Проект строится без ошибок и предупреждений. Я использую бета-версию VS2011, OpenCV 2.4 и windows7.

сообщение об ошибке:

OpenCV Error: The function/feature is not implemented < OpenCV was built without SURF support> in unknown function,file ......srcopencvmoduleslegacysrcfeatures2d.cpp, line 77

Я попытался снова построить OpenCV 2.4 с помощью Cmake, а затем VS2011 в режиме отладки, а затем добавил пути lib в IDE, но все равно никакого результата.

как я могу исправить это?

    #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:SURF1.jpg"); 
    IplImage *image2 = cvLoadImage("C:SURF2.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 ответов


принято от ответ (Почему бы вам не google ваш вопрос, прежде чем спрашивать?):

код SIFT и SURF был перемещен в OpenCV v2.4 к новому модулю под названием nonfree. Убедитесь, что вы связываете (DLL в Windlows) с ним. В linux эта библиотека называется libopencv_nonfree.so.


Это не ошибка. SURF находится в несвободном модуле. Для его использования необходимо инициализировать несвободный модуль:

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

недавно я изучаю серфинг. Для этого вопроса Вы можете добавить opencv_nonfree240d.lib и opencv_nonfree240.lib к пути lib вашего проекта.


для ubuntu скрипт на https://help.ubuntu.com/community/OpenCV можно изменить для несвободного использования surf/sift, добавив

libopencv_nonfree

до конца команды sudo apt-get и

- D BUILD_opencv_nonfree=ON

до конца команды cmake. Он работал только для меня после удаления всего, что я мог найти, имея дело с opencv из программного центра. Кстати, по Также несвободная библиотека opencv, " libopencv-nonfree2.- Что, похоже, не помогло делу. Я не эксперт в таких вещах, поэтому я не знаю, правильно ли я сделал 100%, но он позволяет такие команды, как

surf = cv2.SURF (400)

и

keypoints = surfDetector.detect (im)

для запуска, который ранее не был (первый вызвал ошибку типа "не найден", а второй вызвал segfault).

версия opencv.sh что позволило мне использовать несвободный серфинг / просеивание наклеены наhttp://pastebin.com/sQzDdx5i
Версия, которая работает сейчас, - opencv-2.4.9, но, возможно, это будет работать для других версий, поскольку сценарий кажется несколько агностическим, как и имена lib.