Функция OpenSV SURF не реализована
Когда я пытаюсь запустить образец find_obj.cpp
или любую программу find_obj.cpp
SURF, я получаю следующую ошибку в командной строке при выполнении кода. Проект строится без ошибок и предупреждений. Я использую VS2011 бета, OpenCV 2.4 и Windows7.
Сообщение об ошибке:
OpenCV Error: The function/feature is not implemented in unknown function,file ..\..\..\src\opencv\modules\legacy\src\features2d.cpp, line 77
Я попытался снова создать OpenCV 2.4, используя Cmake, а затем VS2011 в режиме отладки, а затем добавил пути lib в IDE, но все равно никакого результата.
- Как вызвать функцию C ++ из C?
- Что такое Microsoft Visual Studio, эквивалентная опции GCC ld - whall-archive
- std :: to_string - больше чем экземпляр перегруженной функции соответствует списку аргументов
- Будут ли исключения C ++ безопасно распространяться через C-код?
- C ++ Метод статического члена вызывает экземпляр classа
Как я могу это исправить?
#include #include #include #include #include #include #include #include #include #include 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; }
- Как создать строковый литерал UTF-8 в Visual C ++ 2008
- Печать значений всех полей в структуре C ++
- Инициализация значений и типы не POD
- Включение VLA (массивы переменной длины) в MS Visual C ++?
- Использует ли #pragma warning push / pop правильный способ временного изменения уровня предупреждения?
- Каковы различные соглашения о вызовах в C / C ++ и что они означают?
- Что происходит с тем, что происходит с памятью с памятью std :: deque?
- Как проверить числовой ввод C ++
Из этого ответа (почему бы вам не задать свой вопрос перед тем, как спросить?):
Код SIFT и SURF был перемещен в OpenCV v2.4 на новый модуль, называемый nonfree
. Убедитесь, что вы связываете (DLL в Windlows) с ним. В linux эта библиотека называется libopencv_nonfree.so
.
Это не ошибка. SURF находится в несвободном модуле. Чтобы использовать его, вы должны инициализировать незанятый модуль:
#include ... cv::initModule_nonfree();
Недавно я изучаю SURF. По этому вопросу вы можете добавить opencv_nonfree240d.lib и opencv_nonfree240.lib в путь к вашему проекту.
Для ubuntu сценарий на 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, но, возможно, это будет работать для других версий, поскольку сценарий кажется несколько агностическим, как и имена lib.