Функции Opencv могут быть вызваны только в стиле кода C, но не в стиле C ++

0

Я действительно новичок в Opencv. После загрузки и установки Opencv 2.4 в соответствии с инструкцией я начал писать свою первую программу Opencv, которая была в основном копией учебника в Интернете.

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

#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main( int argc, char** argv )
{
    char* filename = "C:\\Research\abc.pgm";  
     IplImage *img0;

    if( (img0 = cvLoadImage(filename,-1)) == 0 )
        return 0;

    cvNamedWindow( "image", 0 );
    cvShowImage( "image", img0 );
    cvWaitKey(0);  
    cvDestroyWindow("image");
    cvReleaseImage(&img0);



    return 0;
}

Коды работают очень хорошо, но вы можете заметить, что в приведенном выше коде, вызывающем функцию Opencv, используется код кода C. Поэтому я решил перейти на код кода С++ со следующими кодами:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std; 

int main( int argc, char** argv )
{ 
    if( argc != 2) 
    {
     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
     return -1;
    }

    Mat image;
    image = imread(argv[1], CV_LOAD_IMAGE_COLOR);   // Read the file

    if(! image.data )                              // Check for invalid input
    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }

    namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display.
    imshow( "Display window", image );                   // Show our image inside it.

    waitKey(0);                                          // Wait for a keystroke in the window
    return 0;
}

Однако в этом случае программа имеет несколько ошибок ссылок, хотя компиляция кажется прекрасной. Ошибки связи, которые я получил, следующие:

Error   2   error LNK2019: unresolved external symbol "void __cdecl cv::namedWindow(class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > const &,int)" (?namedWindow@cv@@YAXABV?$basic_string@DV?$char_traits@D@stlp_std@@V?$allocator@D@2@@stlp_std@@H@Z) referenced in function _main    C:\Research\OpencvTest\OpencvTest.obj
Error   1   error LNK2019: unresolved external symbol "void __cdecl cv::imshow(class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > const &,class cv::_InputArray const &)" (?imshow@cv@@YAXABV?$basic_string@DV?$char_traits@D@stlp_std@@V?$allocator@D@2@@stlp_std@@ABV_InputArray@1@@Z) referenced in function _main    C:\Research\OpencvTest\OpencvTest.obj

Я совершенно уверен, что добавил в свою программу необходимые библиотеки Opencv (я использую VC10), а дополнительные библиотеки, которые я добавил, следующие:

stl_port.lib
opencv_highgui242d.lib
opencv_core242d.lib

Мне было интересно, что случилось с моей настройкой. Почему он работает для первой программы, но не второй? Любые идеи будут оценены. Спасибо!

  • 0
    Вы используете opencv_highgui242d.lib и opencv_core242d.lib поэтому они подходят для сборки в режиме отладки. Возможно, вы строите релиз? Кроме того, старайтесь избегать using операторов и пишите std:: и cv:: . using утверждений считается (по крайней мере, некоторыми людьми) плохой практикой. См. Stackoverflow.com/questions/1452721/…
  • 0
    @DigitalDa Спасибо, и я уверен, что я строю в отладке. Я буду следовать предложению об использовании заявления.
Теги:
opencv
stl
compilation

1 ответ

1
Лучший ответ

Это как-то связано с смешиванием STLPort и MSVC STL. Вы, вероятно, сами не строили библиотеки OpenCV, поэтому они используют VC10 STL. С интерфейсом C там просто char*, но с С++ интерфейсом компоновщик путается с std::string в методах. Вы должны увидеть тот же результат с помощью imread, если вы добавите его в string тоже.

Можно ли смешивать реализации STL в моем проекте?

  • 0
    Спасибо, и это правда, что я использую скомпилированные библиотеки OpenCV, загруженные с сайта. На самом деле у меня проблемы с сборкой OpenCV на моей локальной машине из-за путаницы между STLPort и MSVC STL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню