2012-06-24 13 views
9

Kiedy próbuję uruchomić próbkę find_obj.cpp lub dowolny program SURF OpenCV, pojawia się następujący błąd w wierszu polecenia podczas wykonywania kodu. Projekt jest budowany bez błędów i ostrzeżeń. Używam wersji beta VS2011, OpenCV 2.4 i Windows7.Funkcja OpenCV SURF nie jest zaimplementowana

komunikat błędu:

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 

że próbuje ponownie budowie OpenCV 2,4, a następnie przy użyciu cUpewnij VS2011 w trybie debugowania, a następnie dodano lib ścieżek IDE, ale bez rezultatu.

Jak mogę to naprawić?

#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; 
} 

Odpowiedz

10

Zrobione z this answer (dlaczego nie można google zapytanie przed pytaniem?):

SIFT i surfować kod został przeniesiony w OpenCV v2.4 do nowego modułu o nazwie nonfree. Upewnij się, że łączysz (DLL w Windlows) do niego. W Linuksie ta biblioteka nazywa się libopencv_nonfree.so.

+2

ya goeded na forach opencv i zawierałem opencv_nonfree240.lib ..i nagłówki to 1 ...... opencv2/objdetect/objdetect.hpp ....... 2 ..... .opencv2/features2d/features2d.hpp ..... 3 ......opencv2/highgui/highgui.hpp ...... 4 ...... opencv2/calib3d/calib3d.hpp ..... 5 ...... opencv2/nonfree/nonfree.hpp .. .... 6 ...... opencv2/imgproc/imgproc_c.h ....... 7 ...... opencv2/legacy/legacy.hpp ...... 8. ..... opencv2/legacy/compat.hpp ...... –

+0

@Astor .... w IDE ... ustawiam ścieżkę do C: \ OpenCV2.4 \ opencv \ build \ x86 \ vc10 \ lib ... zapisałem dysk opencv2.4 in c ... folder bin zawiera całą bibliotekę dll, w której sprawdziłem, zawiera plik opencv_nonfree240.dll ... oraz w dodatkowych zależnościach, które dałem opencv_nonfree240. lib –

+0

katalogi bibliotek = C: \ OpenCV2.4 \ opencv \ build \ x86 \ vc10 \ lib dodatkowe zależności = opencv_nonfree240.lib to jest moje ustawienie w VS2011 –

3

Niedawno uczę się SURF. Na to pytanie możesz dodać plik opencv_nonfree240d.lib i opencv_nonfree240.lib do ścieżki biblioteki swojego projektu.

8

To nie jest błąd. SURF znajduje się w niewolnym module. Aby z niego skorzystać należy zainicjować moduł niewolne:

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

dla Ubuntu skrypt w https://help.ubuntu.com/community/OpenCV mogą być modyfikowane dla niewolnego surfowania/przesiać korzystanie dodając

libopencv_nonfree

do końca sudo apt-get polecenie, a

-D BUILD_opencv_nonfree = ON

do końca polecenia cmake. Udało mi się to tylko po odinstalowaniu wszystkiego, co mogłem znaleźć w opencv z centrum oprogramowania. Nawiasem mówiąc, centrum oprogramowania posiadało również niewolną bibliotekę opencv, "libopencv-nonfree2.4", co nie wydawało się pomocne. nie jestem ekspertem w tej rzeczy, więc nie wiem, czy to co zrobiłem jest w 100% rację, ale pozwala poleceń takich jak

surfowania = cv2.SURF (400)

i

keypoints = surfDetector.detect (im)

do uruchomienia, który wcześniej nie był (pierwszy spowodował błąd typu "nie znaleziono", a drugi spowodował błąd segfault).

wersji opencv.sh który pozwolił mi korzystać niewolne surfowania/przesiać wklejony do http://pastebin.com/sQzDdx5i
wersji, która pracuje teraz jest OpenCV-2.4.9, ale być może to będzie działać w innych wersjach jako scenariusz wydaje się być nieco agnostyczne, podobnie jak nazwy lib.

Powiązane problemy