Opencv 函数只能以 C 代码方式调用,但不能以 C++ 方式调用
Posted
技术标签:
【中文标题】Opencv 函数只能以 C 代码方式调用,但不能以 C++ 方式调用【英文标题】:Opencv functions can only be invoked in C code fashion but not in C++ fashion 【发布时间】:2012-08-02 15:44:26 【问题描述】:我对 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 代码方式。因此,我决定使用以下代码继续使用 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
我想知道我的设置有什么问题。为什么它适用于第一个程序而不适用于第二个程序?任何想法将不胜感激。谢谢!
【问题讨论】:
您使用的是opencv_highgui242d.lib
和opencv_core242d.lib
,因此它们适用于调试模式构建。也许你正在发布?此外,尽量避免使用using
语句并编写std::
和cv::
。 using
语句被认为(至少某些人)是不好的做法。见***.com/questions/1452721/…
@DigitalDa 谢谢,我确信我正在调试中构建。我会按照 using 语句的建议。
【参考方案1】:
这与混合 STLPort 和 MSVC STL 有关。您可能没有自己构建 OpenCV 库,所以他们使用的是 VC10 STL。对于 C 接口,只有 char*
,但对于 C++ 接口,链接器在方法中会与 std::string
混淆。如果您也将string
的输入转换为string
,您应该会看到与imread
相同的结果。
Can I mix STL implementations in my project?
【讨论】:
谢谢,确实我使用的是从网站下载的已编译 OpenCV 库。事实上,由于 STLPort 和 MSVC STL 之间的混淆,我在使用本地机器构建 OpenCV 时遇到了问题。以上是关于Opencv 函数只能以 C 代码方式调用,但不能以 C++ 方式调用的主要内容,如果未能解决你的问题,请参考以下文章
Python根据 URL 读取网络图片的两种方式(OpenCV)
Python根据 URL 读取网络图片的两种方式(OpenCV)