2012-08-02 57 views
0

我對Opencv真的很陌生。根據指令下載和安裝Opencv 2.4後,我開始編寫我的第一個Opencv程序,該程序基本上是網上教程的一個副本。Opencv函數只能用C代碼方式調用,而不能用C++方式調用

#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代碼的方式。因此,我決定繼續用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)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 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 &)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z) referenced in function _main C:\Research\OpencvTest\OpencvTest.obj 

我敢肯定,我已經在我的程序(我使用VC10)根據需要添加opencv的圖書館,我已經添加了額外的庫如下:

stl_port.lib 
opencv_highgui242d.lib 
opencv_core242d.lib 

我想知道我的設置有什麼問題。爲什麼它對第一個程序有效,而對第二個程序沒有影響?任何想法將不勝感激。謝謝!

+0

您正在使用'opencv_highgui242d.lib'和'opencv_core242d.lib'所以這些都是適合調試模式的構建。也許你正在發佈? 此外,嘗試避免'using'語句並寫入'std ::'和'cv ::'。 「使用」陳述被認爲(至少有人)是不好的做法。請參閱http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c – 2012-08-02 16:25:37

+0

@DigitalDa謝謝,我相信我在構建調試。我將遵循關於使用聲明的建議。 – feelfree 2012-08-02 16:34:49

回答

1

它與混合STLPort和MSVC STL有關。你可能沒有自己構建OpenCV庫,所以他們使用VC10 STL。使用C接口,只有char*,但C++接口鏈接器在方法中與std::string混淆。如果您將其輸入到string,則您應該看到與imread相同的結果。

Can I mix STL implementations in my project?

+0

謝謝,我確實使用從網站下載的已編譯的OpenCV庫。事實上,由於STLPort和MSVC STL之間的混淆,我在使用本地機器構建OpenCV時遇到了問題。 – feelfree 2012-08-03 07:30:31