3
votes

and i was having the following problem when running some code i found on the internet from http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html: newmain.cpp:(.text+0x17): undefined reference to `cv::VideoCapture::VideoCapture()'

newmain.cpp:(.text+0x35): undefined reference to `cv::CascadeClassifier::load(std::string const&)'

newmain.cpp:(.text+0x5f): undefined reference to `cv::CascadeClassifier::load(std::string const&)'

newmain.cpp:(.text+0x8e): undefined reference to `cv::VideoCapture::open(int)'

newmain.cpp:(.text+0x9d): undefined reference to `cv::VideoCapture::isOpened() const'

newmain.cpp:(.text+0x116): undefined reference to `cv::waitKey(int)'

newmain.cpp:(.text+0x141): undefined reference to `cv::VideoCapture::read(cv::Mat&)'

(the list goes on but all the same type of error)

The code is supposed to detect faces and eyes from pictures.

The code uses some functions from opencv2, which I have installed:

    #include "opencv2/objdetect/objdetect.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"

    #include <iostream>
    #include <stdio.h>

    using namespace std;
    using namespace cv;

    /** Function Headers */
    void detectAndDisplay( Mat frame );

    /** Global variables */
    String face_cascade_name = "haarcascade_frontalface_alt.xml";
    String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;
    String window_name = "Capture - Face detection";

    /** @function main */
    int main( void )
    {
        VideoCapture capture;
        Mat frame;

        //-- 1. Load the cascades
        if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading face cascade\n"); return -1; };
        if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading eyes cascade\n"); return -1; };

        //-- 2. Read the video stream
        capture.open( -1 );
        if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

        while ( capture.read(frame) )
        {
            if( frame.empty() )
            {
                printf(" --(!) No captured frame -- Break!");
                break;
            }

            //-- 3. Apply the classifier to the frame
            detectAndDisplay( frame );

            int c = waitKey(10);
            if( (char)c == 27 ) { break; } // escape
        }
        return 0;
    }

    /** @function detectAndDisplay */
    void detectAndDisplay( Mat frame )
    {
        std::vector<Rect> faces;
        Mat frame_gray;

        cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
        equalizeHist( frame_gray, frame_gray );

        //-- Detect faces
        face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) );

        for ( size_t i = 0; i < faces.size(); i++ )
        {
            Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );
            ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2 ), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );

            Mat faceROI = frame_gray( faces[i] );
            std::vector<Rect> eyes;

            //-- In each face, detect eyes
            eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CASCADE_SCALE_IMAGE, Size(30, 30) );

            for ( size_t j = 0; j < eyes.size(); j++ )
            {
                Point eye_center( faces[i].x + eyes[j].x + eyes[j].width/2, faces[i].y + eyes[j].y + eyes[j].height/2 );
                int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
                circle( frame, eye_center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
            }
        }
        //-- Show what you got
        imshow( window_name, frame );
    }

Thanks for any help you can give me!

2
Are you linking to the opencv library?John Saxton
linker is not finding opencvThomasMcLeod
I'm not getting any errors on the include statements if thats what you mean? But like I said I know like nothing about c++, so if theres more that I have to do than that I probably havent done it...Eric Pasewark
how can I tell it to find opencv then?Eric Pasewark
Compilation and linking are two different processes. How are you compiling? What tools are you using?ThomasMcLeod

2 Answers

3
votes

As berak said, you need to link the these libraries. To do it at your project on eclipse, you should tell eclipse where find the Include files for opencv and Where are the libraries to link.

  1. Go to Project–>Properties
  2. In C/C++ Build, click on Settings. At the right, choose the Tool Settings Tab. Here we will enter the headers and libraries info:
  3. In GCC C++ Compiler, go to Includes. In Include paths(-l) you should include the path of the folder where opencv was installed. By default this place is:

/usr/local/include/opencv

  1. Now go to GCC C++ Linker
  2. First in Library search path (-L) you have to write the path to where the opencv libraries reside. By default this place is:

/usr/local/lib

  1. Then in Libraries(-l) add the OpenCV libraries that you may need. Examples: opencv_core, opencv_imgproc, opencv_highgui... In our case, we want add opencv_videoio (it's a cpp lib).
  2. Done, you're ready to build your project with opencv at eclipse.

The original tutorial is at Opencv Documentation

12
votes

it seems, you're not linking to any of the opencv libs.

gcc objDetection.cpp -o objDetection -lopencv_core -lopencv_imgproc -lopencv_objdetect -lopencv_highgui