在Visual Studio 2010中设置OpenCV-2.3

37

我正在尝试在Visual Studio 2010 Express中使用OpenCV 2.3。我的代码来自示例:

#include "stdafx.h"
#include <highgui.h>

int _tmain(int argc, _TCHAR* argv[])
{
    int c;
    // allocate memory for an image
    IplImage *img;
    // capture from video device #1
    CvCapture* capture = cvCaptureFromCAM(1);
    // create a window to display the images
    cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
    // position the window
    cvMoveWindow("mainWin", 5, 5);
    while(1)
    {
        // retrieve the captured frame
        img=cvQueryFrame(capture);
        // show the image in the window
        cvShowImage("mainWin", img );
        // wait 10 ms for a key to be pressed
        c=cvWaitKey(10);
        // escape key terminates program
        if(c == 27)         
            break;
    }

    return 0;
}

我做了什么?

  • build\binbuild\{x86|x64}\{vc9\vc10\mingw}\bin之一添加到我的系统路径中(用于使用DLL)。
  • build\{x86|x64}\{vc9\vc10\mingw}\libbuild\{x86|x64}\{vc9\vc10\mingw}\staticlib作为库目录添加到我的链接器设置中。
  • build\includebuild\include\opencv作为包含目录添加到我的编译器设置中。

结果是:

1>LINK: 致命错误 LNK1104: 无法打开文件“c:\OpenCV2.3\build\x86\vc10\lib.obj”

OpenCV文件夹中没有lib.obj。 我只解压了OpenCV-2.3.0-win-superpack.exe,而没有使用CMake软件。

我做错了什么?

3个回答

94

好的,官方指南是用于在VS2010上安装OpenCV 2.1的,因此我编写了以下说明,展示如何正确安装和配置x86版本的OpenCV 2.3Visual Studio 2010(Express)上,因为很多人似乎在设置时遇到了问题。

下载OpenCV-2.3.0-win-superpack.exe并执行它以将所有文件提取到名为OpenCV2.3的文件夹中。在这个文件夹中有两个目录:buildopencv。在VS2010上的所有设置都将引用build目录。出于实际目的,我将文件夹OpenCV2.3移动到了我的C:\驱动器中,因此请注意我在本指南中建议的路径,因为你的路径可能不同。

在Visual Studio中,创建一个新的Win32 Console Application项目,并随意命名。之后,会弹出一个新窗口。单击选项卡Application Settings,并确保选择了Empty Project选项:

enter image description here

在文件夹Source Files中添加一个新的文件main.cpp,然后将以下代码添加到main.cpp中:

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main(int argc, char* argv[])
{
if (argc < 2)
{
    printf("Usage: ./opencv_hello <file.png>\n");
    return -1;
}

    IplImage* img = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);
if (!img)
{
    return -1;
}

cvNamedWindow("display", CV_WINDOW_AUTOSIZE);
    cvShowImage("display", img );

    cvWaitKey(0);        

    return 0;
}

此时,我们需要配置项目以便能够找到OpenCV头文件和库。进入项目属性(ALT+F7),一旦打开新窗口,请执行以下操作:

  • 配置框中,选择所有配置

  • 打开配置属性 > C/C++ > 常规,并编辑附加包含目录字段以添加这3个路径(用于头文件):

    C:\OpenCV2.3\build\include\opencv

    C:\OpenCV2.3\build\include\opencv2

    C:\OpenCV2.3\build\include

enter image description here

请注意,include\opencv 用于 OpenCV 的 C 接口,include\opencv2 用于 C++ 接口。我们还添加了文件夹 include,以防止 C 接口的某些头文件引用了 C++ 头文件,如 opencv2\core,从而导致构建失败。
然后,在配置属性 > 链接器 > 常规中添加库的路径,在附加库目录字段中添加:C:\OpenCV2.3\build\x86\vc9\lib

enter image description here

  • 最后,在这个简单的测试中,我们将添加库opencv_core230.libopencv_highgui230.lib。 所以请前往配置属性 > 链接器 > 输入并添加它们:

enter image description here

当编写更复杂的应用程序时,您可能需要添加其他OpenCV库,这些库在我们的小项目中没有提到。
按下F7键以构建解决方案,然后您应该会看到:
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

要执行该应用程序,您需要将系统的PATH环境变量修改以添加OpenCV的DLL文件所在位置。请将以下内容添加到PATH末尾:

; C:\OpenCV2.3\build\x86\vc9\bin

@Elfoc 大幅改进的答案,逐步展示如何配置OpenCV 2.3和VS2010。 - karlphillip
2
我已将 e:\opencv\build\x86\vc9\bin 添加到系统 PATH 环境变量中。但是我在运行时出现了错误:无法找到 opencv_core231d.dll .... 我正在使用 Visual Studio 2008,Pentium 4 机器。有任何想法是什么错误吗? - Kaushik Acharya
@karlphillip:嗨,2.4.1版本已发布。你能否更新你的答案呢?还是步骤相同?我按照这篇文章的方法尝试了一下:https://dev59.com/uGgv5IYBdhLWcg3wBMSg,但是没有成功。显示“计算机缺少opencv_core240d.dll”文件。 - Abid Rahman K
@karlphillip:显示“无法打开文件'opencv_contrib240d.lib'”。应该怎么办? - Abid Rahman K
1
@karlphillip:太好了,我的朋友。终于对我起作用了。已经+1了这个答案。所以你其他链接的也+1了。 - Abid Rahman K
显示剩余5条评论

3
如果您在编辑PATH环境变量时遇到困难,您也可以将所需的.dll文件复制到项目文件夹中:这些dll文件位于此文件夹../OpenCV2.3/build.x86/vc9/bin 然后将它们复制到创建.exe文件的文件夹中:c:\Users\PIMMES\Documents\Visual Studio 2010\Projects\eigenfaces\Debug(当然,您需要将路径更改为您的Debug文件夹)
您只需要复制您在项目中使用的.dll文件(例如#include),例如,如果您收到错误消息说找不到opencv_core231d.dll,则从上面的位置(bin文件夹)获取此.dll文件,并将其复制到您的项目Debug文件夹中。
希望这有所帮助..

谢谢您提供这种替代方法。它完美地运行了。尽管无法正确检测dll,但我已经正确编辑了环境路径变量。您能否建议我可能的原因? - Snehasish

1
每当我制作一个使用opencv 2.2或更高版本的程序时,我都会包括所有文件,并注释掉我不需要的库。尝试一下这个方法,我相信你需要比仅仅highgui.h更多的内容。
#include "opencv2\opencv.hpp"

using namespace cv;

//#pragma comment(lib, "opencv/opencv_calib3d231.lib")
//#pragma comment(lib, "opencv/opencv_contrib231.lib")
#pragma comment(lib, "opencv/opencv_core231.lib")
//#pragma comment(lib, "opencv/opencv_features2d231.lib")
//#pragma comment(lib, "opencv/opencv_flann231.lib")
//#pragma comment(lib, "opencv/opencv_gpu231.lib")
//#pragma comment(lib, "opencv/opencv_haartraining_engine.lib")
#pragma comment(lib, "opencv/opencv_highgui231.lib")
//#pragma comment(lib, "opencv/opencv_imgproc231.lib")
//#pragma comment(lib, "opencv/opencv_legacy231.lib")
//#pragma comment(lib, "opencv/opencv_ml231.lib")
#pragma comment(lib, "opencv/opencv_objdetect231.lib")
//#pragma comment(lib, "opencv/opencv_ts231.lib")
//#pragma comment(lib, "opencv/opencv_video231.lib")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接