OpenCV - trudności z kompilowaniem

0

Cześć! Od niedawna uczę się programowania w OpenCV 2.4.9 (z różnych poradników) i napotkałem na taki oto problem, z którym nie mogę sobie poradzić. Jestem teraz na etapie rozpoznawania twarzy, jednak nie mogę odpalić żadnych programów z tym związanych, dlatego podejrzewam, że może to być problem z kaskadami. Dla przykładowego programu z tutorialu:

 #include <opencv2/core/core.hpp>                        //Sposób 
#include <opencv2/highgui/highgui.hpp>                    //dokładny 
#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <string> 
#include <iostream> 

using namespace cv; 
using namespace std; 

string face_cascade_name = "haarcascade_frontalface_alt.xml";    //Nazwa kaskady którą wykorzystujemy do rozpoznania twarzy 
CascadeClassifier face_cascade;                                //Utworzenie obiektu cascady twarzy 
string window_name = "Hello Face !"; 
const string img_name = "cotillard.jpg"; 

void detectFace( Mat img ); 

int main( int argc, char** argv ) 
{ 
    Mat img;                                            //Utworzenie nowej macierzy na nasz obrazek 
    img = imread( img_name );                            //Wczytanie obrazka z dysku 
    if ( !img.data )                                    //Sprawdzenie czy ładowanie obrazka przebiegło pomyslnie 
    { 
        cout << "Nie znaleziono pliku " <<  img_name << "."; 
        return -1; 
    } 
    if( !face_cascade.load( face_cascade_name ) )        //Ładowanie pliku ze sprawdzeniem poprawnoci 
    { 
        cout << "Nie znaleziono pliku " << face_cascade_name << "."; 
        return -2; 
    } 
    namedWindow(window_name, CV_WINDOW_AUTOSIZE);    //Utworzenie okna (nazwa okna, ustalenie rozmiaru) 
    detectFace(img); 
    waitKey(0);                                            //Odczekanie na wcisnięce klawisza z opóźnieniem 0ms 
    return 0; 
} 

void detectFace( Mat img ) 
{ 
    vector<Rect> faces;                            //Utworzenie bufora na twarze 
    Mat img_gray;                                //Utworzenie bufora na obrazek w odcieniach szarosci 

    cvtColor(img, img_gray,  CV_BGR2GRAY );                //Konwersja obrazu do odcieni szarosci 
    //equalizeHist(img_gray, img_gray);                    //Zaaplikowanie do obrazu jego historogramu, poprawa kontrastu 

    face_cascade.detectMultiScale(img_gray, faces, 1.1, 3, 0|CV_HAAR_SCALE_IMAGE, Size(50, 50) ); 
    for( unsigned i = 0; i < faces.size(); i++ ) 
    { 
        Rect rect_face( faces[i] );    //Kwadrat okreslający twarz 
        //ellipse( img, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 120, 12 ), 2, 2, 0 ); 
        rectangle(img, rect_face, Scalar( 120, 5, 86 ), 2, 2, 0  ); 
    } 
    imshow(window_name, img);                        //Pokazanie obrazka w oknmie o nazwie "Hello Face !" 
}

Wyskakują mi takie błędy:

  • Error 1 error LNK2019: unresolved external symbol "public: __thiscall cv::CascadeClassifier(void)" (??0CascadeClassifier@cv@@QAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'face_cascade''(void)" (??__Eface_cascade@@YAXXZ) C:\Users\MICHAŁ\Documents\Projekt\ConsoleApplication3\ConsoleApplication3\main.obj ConsoleApplication3

  • Error 2 error LNK2019: unresolved external symbol "public: virtual __thiscall cv::~CascadeClassifier(void)" (??1CascadeClassifier@cv@@UAE@XZ) referenced in function "void __cdecl `dynamic atexit destructor for 'face_cascade''(void)" (??__Fface_cascade@@YAXXZ) C:\Users\MICHAŁ\Documents\Projekt\ConsoleApplication3\ConsoleApplication3\main.obj ConsoleApplication3

  • Error 3 error LNK2019: unresolved external symbol "public: bool __thiscall cv::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?load@CascadeClassifier@cv@@QAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main C:\Users\MICHAŁ\Documents\Projekt\ConsoleApplication3\ConsoleApplication3\main.obj ConsoleApplication3

  • Error 4 error LNK2019: unresolved external symbol "public: virtual void thiscall cv::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect<int>,class std::allocator<class cv::Rect<int> > > &,double,int,int,class cv::Size_<int>,class cv::Size_<int>)" (?detectMultiScale@CascadeClassifier@cv@@UAEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@NHHV?$Size_@H@2@2@Z) referenced in function "void __cdecl detectFace(class cv::Mat)" (?detectFace@@YAXVMat@cv@@@Z) C:\Users\MICHAŁ\Documents\Projekt\ConsoleApplication3\ConsoleApplication3\main.obj ConsoleApplication3

  • Error 5 error LNK1120: 4 unresolved externals C:\Users\MICHAŁ\Documents\Projekt\ConsoleApplication3\Debug\ConsoleApplication3.exe ConsoleApplication3

Szukałem w internecie odnośnie błędu "unresolved external symbol", ale nie potrafię rozpoznać z czym jest tutaj problem. Może ma to związek z bibliotekami? Coś z nimi nie tak?

Z góry dziękuję za pomoc :)

0

Spróbuj umieścić pliki w takim folderze żeby w ścieżkach nie było polskich znaków.

0
reptile333 napisał(a):

Linker nie widzi plików *.lib http://docs.opencv.org/2.4/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html#the-local-method

Dziękuję! Faktycznie, dodatnie brakującej biblioteki pomogło :)

Jednak pojawiają się kolejne problemy, które ciągną się za mną jeszcze z poprzednich programów - na przykład taki powyższy program po podlinkowaniu biblioteki włącza się, jednak od razu wyskakuje taki błąd:

Unhandled exception at at 0x75EBC54F in ConsoleApplication3.exe: Microsoft C++ exception: cv::Exception at memory location 0x0041E998.

Dla poniższego programu:

#include <opencv2/highgui/highgui.hpp> 
#include "opencv2/imgproc/imgproc.hpp" 
#include <string> 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main() 
{ 
    VideoCapture capture = VideoCapture(0);//Przechwycienie uchwytu kamery o nr. 0 
    string window_name [] = { "Kamera", "Binary" };//Nazwy dla okien 
    Mat frame, img, hsv_img, binary; //Miejsce na obrazki 
    vector<Mat> hsv_split;        //Miejsce na kanały hsv 
    for ( int i = 0; i < 2; i++ ) namedWindow(window_name[i], CV_WINDOW_AUTOSIZE);    //Utworzenie 2 okien 
    int lowerb = 100, upperb = 109;    //Ustalenie wartosci poczatkowych dla progowania 
    createTrackbar( "lb", window_name[1], &lowerb, 255, NULL ); 
    //Utworzenie trackbar'ow 
    createTrackbar( "ub", window_name[1], &upperb, 255, NULL ); 
    while ( waitKey(20) != 27 )                    //Odczekanie 20 ms 
    { 
        capture >> frame;                    //Pobranie kolejnej klatki 
        frame.copyTo(img);                /Skopiowanie klatki do img 
        cvtColor(img, hsv_img, CV_BGR2HSV);        //Konwrsja do HSV 
        split(hsv_img, hsv_split);        //Podzial HSV na poszczegolne kanaly 
        inRange(hsv_split[0], lowerb, upperb, binary);                        //Progowanie zgodnie z wartosciami lowerb, i upperb 
        cv::Mat element(3,3,CV_8U,cv::Scalar(1));    //Okreslenie opcji erozji 
        blur(binary, binary, cv::Size(3,3) );        //Rozmycie 
        erode(binary, binary, element);            //Erozja 
        imshow(window_name[0], img );            //Obrazek Orginalny 
        imshow(window_name[1], binary);            //Obraz binarny 
    } 
    capture.release();                        //Zwolnienie uchwytu kamery 
    return 0; 
}

Występują podobne błędy. Udało mi się je ominąć zamieniając waitKey(20) na waitKey(1000) i większe, wtedy program działa, ale nie wiem dlaczego tak się dzieje.

0

Powiedziałbym że jak czekasz tylko 20ms przy każdej iteracji to kamera nie nadąża z rejestracją i linijka
capture >> frame;
zwraca w pewnym momencie pustą macierz i któraś z następnych operacji robi bałagan. Spróbuj sprawdzić po pobraniu klatki czy macierz nie jest pusta.

1 użytkowników online, w tym zalogowanych: 0, gości: 1