wxDEV + OpenCV错误:对“cvLoadImage”

时间:2017-12-04 08:24:32

标签: opencv wxwidgets

大家好,我正在尝试在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”编写。顺便说一句,我确实在运行程序之前更改了编译器。谢谢你的帮助!

2 个答案:

答案 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 );
}

希望这有帮助