简体   繁体   English

在C ++中使用库时的“未定义引用”

[英]“Undefined reference to” when using library in C++

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()' 当我在互联网上运行一些代码时遇到以下问题: http ://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html:newmain.cpp :(。text + 0x17):未定义引用`cv :: VideoCapture :: VideoCapture()'

newmain.cpp:(.text+0x35): undefined reference to `cv::CascadeClassifier::load(std::string const&)' newmain.cpp :(。text + 0x35):对`cv :: CascadeClassifier :: load(std :: string const&)'的未定义引用

newmain.cpp:(.text+0x5f): undefined reference to `cv::CascadeClassifier::load(std::string const&)' newmain.cpp :(。text + 0x5f):对`cv :: CascadeClassifier :: load(std :: string const&)'的未定义引用

newmain.cpp:(.text+0x8e): undefined reference to `cv::VideoCapture::open(int)' newmain.cpp :(。text + 0x8e):对`cv :: VideoCapture :: open(int)'的未定义引用

newmain.cpp:(.text+0x9d): undefined reference to `cv::VideoCapture::isOpened() const' newmain.cpp :(。text + 0x9d):对`cv :: VideoCapture :: isOpened()const'的未定义引用

newmain.cpp:(.text+0x116): undefined reference to `cv::waitKey(int)' newmain.cpp :(。text + 0x116):对`cv :: waitKey(int)'的未定义引用

newmain.cpp:(.text+0x141): undefined reference to `cv::VideoCapture::read(cv::Mat&)' newmain.cpp :(。text + 0x141):对`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: 代码使用opencv2中的一些函数,我已经安装了这些函数:

    #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! 感谢你给与我的帮助!

看来,你没有链接到任何opencv库。

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

As berak said, you need to link the these libraries. 正如berak所说,你需要链接这些库。 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. 要在eclipse上的项目中执行此操作,您应该告诉eclipse在哪里找到opencv的Include文件以及要链接的库的位置

  1. Go to Project–>Properties 转到项目 - >属性
  2. In C/C++ Build , click on Settings. C / C ++ Build中 ,单击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 . GCC C ++编译器中 ,转到包含 In Include paths(-l) you should include the path of the folder where opencv was installed. 在Include路径(-l)中,您应该包含安装opencv的文件夹的路径。 By default this place is: 默认情况下,这个地方是:

/usr/local/include/opencv 在/ usr /本地/包括/ OpenCV的

  1. Now go to GCC C++ Linker 现在转到GCC C ++ Linker
  2. First in Library search path (-L) you have to write the path to where the opencv libraries reside. 首先在库搜索路径(-L)中,您必须编写opencv库所在的路径。 By default this place is: 默认情况下,这个地方是:

/usr/local/lib 在/ usr / local / lib目录

  1. Then in Libraries(-l) add the OpenCV libraries that you may need. 然后在Libraries(-l)中添加您可能需要的OpenCV库。 Examples: opencv_core, opencv_imgproc, opencv_highgui... In our case, we want add opencv_videoio (it's a cpp lib). 示例:opencv_core,opencv_imgproc,opencv_highgui ...在我们的例子中,我们想要添加opencv_videoio (它是一个cpp lib)。
  2. Done, you're ready to build your project with opencv at eclipse. 完成后,您已准备好在eclipse中使用opencv构建项目。

The original tutorial is at Opencv Documentation 最初的教程是在Opencv文档中

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM