大家好,我正在尝试在wxDev C ++中使用OpenCV库,但无法正确编译。 (OpenCV版本:2.4.13.4)
这些是错误:
[Linker Error] undefined reference to `cvLoadImage'
[Linker Error] undefined reference to `cvShowImage'
[Linker Error] undefined reference to `cvWaitKey'
[Linker Error] undefined reference to `cvReleaseImage'
ld returned 1 exit status
这些是代码:
#include "opencv2/opencv.hpp"
int main()
{
IplImage *srcImg = NULL;
srcImg = cvLoadImage( "temp.jpg", 1);
if( srcImg == NULL ){
return -1;
}
cvShowImage( "Source", srcImg );
cvWaitKey(0);
cvReleaseImage( &srcImg );
}
这些是wxDev的设置: wxDev Compiler Options
似乎wxDev无法识别我从库中包含的那些方法。我该怎么办?
// --------------------------------------------- ---------------------------------
[12/4更新]我忘了说我也试过使用不同版本的OpenCV(3.3.1),所以截图中的设置有一点bug。 “D:\ OpenCV \ 2.4 \ opencv \ build”适用于2.4.13.4。 “D:\ OpenCV \ opencv \ build”适用于3.3.1。我已经将它们都包含在设置中但仍然无法解决。我不知道3.3.1和2.4.1.3之间有什么区别,但它们是最新的更新。
我试图改变我命名库的方式,但它没有用。例如,“ - opencv_core”,“ - lopencv_core”,“ - opencv_core.lib”,“ - lopencv_core.lib”,“ - lopencv_core.a”。
// --------------------------------------------- ---------------------------------
[12/5 update#1]似乎库存在问题。因此,我尝试使用较旧版本的OpenCV2,而不是使用较新版本的OpenCV。幸运的是,它运作得很好!我做了完全相同的事情,但得出了不同的结果。我假设在最新版本中以某种方式修改了软件的方法。希望有人可以为最新版本的OpenCV提供稍后的教程。
[12/5 update#2]成功编译该程序后,我开始运行另一个OpenCV示例。发生了同样的问题。
示例代码:
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(){
Mat img = imread("lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);
imwrite("output.jpg",img);
namedWindow("Display window", WINDOW_AUTOSIZE);
imshow("Display window", img);
waitKey(0);
return 0;
}
其中一些错误:
[Linker Error] undefined reference to `cv::imread(std::string const&, int)
[Linker Error] undefined reference to `cv::namedWindow(std::string const&, int)
[Linker Error] undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)
[Linker Error] undefined reference to `cv::fastFree(void*)'
同样的问题一直在发生,仍在寻找救世主。
// --------------------------------------------- ---------------------------------
[12/6 update]经过多次尝试,我将OpenCV降级为2.0版。该计划成功运作。与其他版本相比,唯一的区别是包含了库的方向。
如果我写#include <opencv2/opencv.hpp>
,其他版本将无效。
如果我写#include <cv.h>, #include <highgui.h>
,版本2.0将起作用。
(版本2.0没有文件opencv2
,所以我必须包含方向。)我不知道它为什么会这样结束。
解决方案是使用版本2.0,也不使用#include <opencv2/opencv.hpp>
。到目前为止,它在大多数示例中运行得非常好。虽然我现在可以开始处理我的项目,但我仍然试图弄清楚如何使用最新版本的OpenCV。
// --------------------------------------------- ---------------------------------
回应 Mark Setchell - 这些是到目前为止文件和设置的屏幕截图:
The lib files and its directions
OpenCV 2.2.0 settings and directions
OpenCV 2.4.11 settings and directions
我尝试过不同版本的OpenCV来运行该程序,该过程的详细信息以“12/5 update”编写。顺便说一句,我确实在运行程序之前更改了编译器。谢谢你的帮助!
答案 0 :(得分:0)
缺少opencv-libs。在您的屏幕显示中,您已添加文件夹,但配置中的名称定义为 -opencv_core ... 。通常,链接它们的选项是-L,即使在wxDev ++中也是如此。所以只需添加如下的库:
-Lopencv_core2413.lib
答案 1 :(得分:0)
根据您的源代码,您忘记使用opencv命名空间。
如果您的图书馆都已正确关联,请尝试添加using namespace cv;
#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
IplImage *srcImg = NULL;
srcImg = cvLoadImage( "temp.jpg", 1);
if( srcImg == NULL ){
return -1;
}
cvShowImage( "Source", srcImg );
cvWaitKey(0);
cvReleaseImage( &srcImg );
}
或明确使用它:
#include "opencv2/opencv.hpp"
int main()
{
cv::IplImage *srcImg = NULL;
srcImg = cv::cvLoadImage( "temp.jpg", 1);
if( srcImg == NULL ){
return -1;
}
cv::cvShowImage( "Source", srcImg );
cv::cvWaitKey(0);
cv::cvReleaseImage( &srcImg );
}
希望这有帮助