Функция OpenSV SURF не реализована
Когда я пытаюсь запустить образец find_obj.cpp
или любую программу OpenSV SURF, я получаю следующую ошибку в командной строке при выполнении кода. Проект строится без ошибок и предупреждений. Я использую VS2011 бета, 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
Я попытался снова создать 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:\\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;
}
Ответы
Ответ 1
Взято из этот ответ (почему бы вам не задать свой вопрос перед тем, как спросить?):
Код SIFT и SURF был перемещен в OpenCV v2.4 на новый модуль, называемый
nonfree
. Убедитесь, что вы связываете (DLL в Windlows) с ним. В linux эта библиотека называется libopencv_nonfree.so
.
Ответ 2
Это не ошибка. SURF находится в несвободном модуле. Чтобы использовать его, вы должны инициализировать незанятый модуль:
#include <opencv2/nonfree/nonfree.hpp>
...
cv::initModule_nonfree();
Ответ 3
Недавно я изучаю SURF. Для этого вопроса вы можете добавить opencv_nonfree240d.lib и opencv_nonfree240.lib в свой путь к проекту.
Ответ 4
Для ubuntu script в
https://help.ubuntu.com/community/OpenCV
может быть изменен для использования без использования серфинга/просеивания, добавив
libopencv_nonfree
до конца команды sudo apt-get и
-D BUILD_opencv_nonfree = ON
до конца команды cmake. Это помогло мне после удаления всего, что я мог найти, с opencv из программного центра. Кстати, в программном центре также была открытая неохраняемая библиотека "libopencv-nonfree2.4", которая, похоже, не помогала.
Я не эксперт в таких материалах, поэтому я не знаю, соответствует ли то, что я сделал, на 100%, но оно позволяет использовать команды, такие как
surf = cv2.SURF(400)
и
keypoints = surfDetector.detect(im)
для запуска, который ранее не был (первый вызвал ошибку типа "не найден", а второй вызвал segfault).
Версия opencv.sh, которая позволила мне использовать беспроволочный серфинг/просеивание, вставленный в http://pastebin.com/sQzDdx5i
Версия, которая работает сейчас, - opencv-2.4.9, но, возможно, это будет работать для других версий, поскольку script кажется несколько агностичным, как и имена lib.