2016-06-18 1 views
0

Я работаю с OpenCV, я попытался запустить следующий код:OpenCV код objdetect неразрешенный внешний символ

#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"; 
    RNG rng(12345); 

    /** @function main */ 
    int main(int argc, const char** argv) 
    { 
     CvCapture* capture; 
     Mat frame; 

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

     //-- 2. Read the video stream 
     capture = cvCaptureFromCAM(-1); 
     if (capture) 
     { 
      while (true) 
      { 
       frame = cvQueryFrame(capture); 

       //-- 3. Apply the classifier to the frame 
       if (!frame.empty()) 
       { 
        detectAndDisplay(frame); 
       } 
       else 
       { 
        printf(" --(!) No captured frame -- Break!"); break; 
       } 

       int c = waitKey(10); 
       if ((char)c == 'c') { break; } 
      } 
     } 
     return 0; 
    } 

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

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

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

     for (size_t i = 0; i < faces.size(); i++) 
     { 
      Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5); 
      ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 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 | CV_HAAR_SCALE_IMAGE, Size(30, 30)); 

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

Я добавил все необходимые библиотеки для зависимостей ссылок, как описано в this потоке, хотя я до сих пор получите сообщение:

1>------ Build started: Project: openvc_program, Configuration: Debug x64 ------ 
1> main.cpp 
1>c:\users\dan\desktop\opencvmy\openvc_program\openvc_program\main.cpp(71): warning C4244: 'argument': conversion from 'double' to 'int', possible loss of data 
1>c:\users\dan\desktop\opencvmy\openvc_program\openvc_program\main.cpp(72): warning C4244: 'argument': conversion from 'double' to 'int', possible loss of data 
1>c:\users\dan\desktop\opencvmy\openvc_program\openvc_program\main.cpp(82): warning C4244: 'argument': conversion from 'double' to 'int', possible loss of data 
1>main.obj : error LNK2019: unresolved external symbol "public: __cdecl cv::CascadeClassifier::CascadeClassifier(void)" ([email protected]@@[email protected]) referenced in function "void __cdecl `dynamic initializer for 'eyes_cascade''(void)" ([email protected]@YAXXZ) 
1>main.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl cv::CascadeClassifier::~CascadeClassifier(void)" ([email protected]@@[email protected]) referenced in function "void __cdecl `dynamic atexit destructor for 'eyes_cascade''(void)" ([email protected]@YAXXZ) 
1>main.obj : error LNK2019: unresolved external symbol "public: bool __cdecl cv::CascadeClassifier::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" ([email protected]@[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z) referenced in function main 
1>main.obj : error LNK2019: unresolved external symbol "public: virtual void __cdecl cv::CascadeClassifier::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>)" ([email protected]@[email protected]@[email protected]@[email protected][email protected]@[email protected]@[email protected][email protected]@[email protected]@@[email protected]@@[email protected]@[email protected]@[email protected]@Z) referenced in function "void __cdecl detectAndDisplay(class cv::Mat)" ([email protected]@[email protected]@@@Z) 
1>C:\Users\Dan\Desktop\opencvMy\openvc_program\x64\Debug\openvc_program.exe : fatal error LNK1120: 4 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Что мне делать, чтобы исправить эту проблему?

+0

Вы ссылаетесь на debug libs? Или выпускать libs? – Berriel

+0

Я связан с debug libs – Danaro

ответ

0

Кажется, вы строите против библиотеки x86, однако ваши настройки установлены на x64, попробуйте переключить конфигурацию на x86 (и установите в соответствии с вашими требованиями - правильные пути lib в Linker-> General-> Additional Library Directories и имена lib Linker-> Input-> Additional Dependencies).

EDIT:

Для Sume настройки проекта для VS 2015:

Извлечение загруженных OpenCV https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.13/opencv-2.4.13.exe/download и скопировать папки для ваших проектов следующим образом:

C: \ OpenCV \ opencv \ build \ include -> D: \ SRC \ sandbox \ OpenCV \ include C: \ OpenCV \ opencv \ build \ x86 \ vc12 \ lib -> D: \ SRC \ sandbox \ OpenCV \ lib \ Win32 \ v120

и установить VS project Properties для отладки - Конфигурация Win32 (VS 2015 установлена ​​вместе с VS 2013 как сборка OpenCV только для последнего vc120, к сожалению, не vc140) и редактировать

Общее -> Набор инструментов для платформы ->Visual Studio 2013 (v120)

C/C++ -> Additional Include Directories ->$ (ProjectDir) OpenCV \ включают

Linker -> Общие -> дополнительные каталоги библиотеки ->$ (ProjectDir) OpenCV \ lib \ Win32 \ $ (PlatformToolset) $ (PlatformToolset)

Linker -> Input -> Дополнительные зависимости ->

opencv_calib3d2413d.lib 
opencv_contrib2413d.lib 
opencv_core2413d.lib 
opencv_features2d2413d.lib 
opencv_flann2413d.lib 
opencv_gpu2413d.lib 
opencv_highgui2413d.lib 
opencv_imgproc2413d.lib 
opencv_legacy2413d.lib 
opencv_ml2413d.lib 
opencv_nonfree2413d.lib 
opencv_objdetect2413d.lib 
opencv_ocl2413d.lib 
opencv_photo2413d.lib 
opencv_stitching2413d.lib 
opencv_superres2413d.lib 
opencv_ts2413d.lib 
opencv_video2413d.lib 
opencv_videostab2413d.lib 

Это должно работать :-)

Для версии, вы сделать то же самое только менять дополнительные зависимостями "OpenCV _ * Lib." - см. разделение d на имя lib.

+0

Спасибо, что помогли! откуда вы знаете, что библиотека x86? – Danaro

+0

Нет x64 lib, пока вы не создадите его самостоятельно ;-) Помогло ли это? VS должен предупредить вас: фатальная ошибка LNK1112: тип модуля модуля «X86» конфликтует с типом целевого устройства «x64», но у вас есть другая ошибка ... – Dom

+0

Итак, почему в каталоге Opecv 2.4.13 есть каталог x64? – Danaro