By RaySaint 2011/5/26

OpenCV2.2版本也出来不久,官方更新上说这个版本支持GPU(OpenCV2.2自带的例子里有GPU版本的用于行人检测的HOG算法)。由于GPU模块是用CUDA写的,所以意味着它是与硬件相关的(只有支持英伟达(Nvidia)CUDA的显卡才能使用这个模块)。

如果你直接从OpenCV的项目主页上下载已经编译好且打成Windows安装包的OpenCV-2.1.0-win32-vs2008.exe并安装,这个是默认不支持CUDA模块的,所以即使你有支持CUDA的显卡,运行自带的测试CUDA的样例程序,会提示你CUDA模块没有安装。

如果你要使用CUDA模块,必须下载OpenCV2.2源代码的压缩包OpenCV-2.2.0-win.zip,当然也可以从OpenCV SVN中获得最新的源代码(这个更好,因为毕竟OpenCV2.2的GPU模块刚出来,也在不断改进中)

下面介绍如何编译带CUDA模块的OpenCV2.2并进行测试。


我的环境及准备工作:

操作系统:Win7 32位

编译环境:VS2008

CUDA:

  • GPU: GeForce 9800 GT
  • CUDA Toolkit version 3.2
  • CUDA SDK version 3.2
  • NVIDIA NPP version 3.2

当然,下面的东西是必需的:

  • OpenCV2.2(解压OpenCV-2.2.0-win.zip获得)
  • CMake-这是一个交叉编译工具,你需要它来配置和生成OpenCV.sln(Visual Studio 解决方案文件)

确保上面的都已准备或安装好。下面我们就用CMake生成带GPU模块的生成OpenCV库的VS2008工程。


用CMake生成OpenCV.sln

解压OpenCV-2.2.0-win.zip到"F:\OpenCV\OpenCV-2.2.0"(这个路径可以自己决定,不要带空格和中文字符),打开CMake:

Image

在Where is the souce code中输入你OpenCV2.2源码所在的位置例如“F:\OpenCV\OpenCV-2.2.0”,并且指定生成的工程OpenCV.sln文件和你想要生成所有文件所在的目录。我指定的位置是”F:\OpenCV\OpenCV-2.2.0\build”。

上面的步骤完成后,点击Configure按钮。出现一个带下拉列表的对话框,选择”Visual Studio 9 2008 ”并点击Finish。

接着会出现一张显示各种可用选项的表。向下滚动找到选项”WITH_CUDA”,勾选它并且再次点击配置按钮:

Image(1)

当你重新配置后,你很有可能看到一堆红色高亮区域表明发生的一些错误,这些错误一般是因为你机器上安装的NPP、CUDA Toolkit和CUDA SDK的路径找不到。你很有可能看到

Image(2)

这些选项和GPU模块有关,所以一定要保证它们的路径正确。从CUDA_COMPUTE_CAPABLITIES可以看出,默认的情况下,所有的CUDA源文件会在计算能力1.1, 1.2, 1.3和2.0的架构下被编译,你可以改变它到任何指定的版本。CUDA_NPP_LIBRARY_ROOT_DIR-NOTFOUND说明你没有指定正确的NPP路径。我的NPP安装在”F:\CUDA\npp_3.2.16_win_32”。这里你需要指定为<NPP_DIRECTORY>/SDK,这里<NPP_DIRECTORY>在我的机器上就是”F:\CUDA\npp_3.2.16_win_32”。

同时也请确认CUDA Toolkit和 SDK路径也是正确的。然后重新点击Configure按钮,如果错误都被解决,则你会看到底部出现Configuring Done的消息:

Image(3)

现在点击Generate并且等待一会儿,OpenCV.sln解决方案文件会在你前面指定的生成目录里出现!如果没有错误,则你会看到Generating Done的消息:

Image(4)


在VS2008中编译OpenCV.sln解决方案

确认你的CUDA的include,bin和libs路径加入到了Visual Studio的搜寻路径中。打开OpenCV.sln,在左边的项目资源管理器中,找到opencv_gpu这个项目,选中它并点击右键,选择属性,在属性页下找到C/C++这个栏目下的代码生成(Code Generation)这一项,依据你的配置(Debug或Release)确定你的运行时库是多线程调试(Multithreaded Debug)多线程(Multithreaded)。同时找到连接器(Linker)里面的输入(Input)这一项,找到忽略指定库这一行,增加libc、libcmt和libcmtd,如下图所示:

Image(5)

点击OK并且开始生成整个解决方案。等待一段时间(可以去干点别的事)直到工程编译完成。如果全部步骤都没有错误,则生成的lib文件会在”F:\OpenCV\OpenCV-2.2.0\build\lib\Debug(或Release)”路径下,生成的dll文件会在”F:\OpenCV\OpenCV-2.2.0\build\bin\Debug(或Release)”路径下。你可以把它们拷贝出来放在自己指定的位置下。


测试OpenCV GPU模块

现在确认为了确认GPU模块能够工作,创建一个测试项目(例如win32 console application),增加一个C++源文件并且键入以下代码

#include <iostream>

#include "opencv2\gpu\gpu.hpp"
#include "opencv2\opencv.hpp"

int main()
{
    try
    {
        cout << cv::gpu::getDeviceName(0);
    }
    catch(const cv::Exception& ex)
    {
        std::cout << "Error:" << ex.what() << endl;
    }

    system("PAUSE");
    return 0;
}

 

如果你成功生成了带CUDA模块的OpenCV2.2,这段代码检测你的GPU的名字并输出到控制台。

另外你也可以试一下OpenCV2.2自带的gpu例子,位于”F:\OpenCV\OpenCV-2.2.0\build\bin\Release”路径下的opencv_test_gpu.exe,它会检测你的GPU并运行数个GPU版本的算法。