用CMake和VS2008生成带CUDA模块的OpenCV2.2

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://underthehood.blog.51cto.com/2531780/574725



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版本的算法。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要让CMake编译的OpenCV包含CUDA模块,需要在CMakeLists.txt文件中添加一些设置。具体步骤如下: 1. 确保你已经安装了CUDAOpenCV,并且CUDAOpenCV的环境变量已经设置好。 2. 打开你的CMakeLists.txt文件,在其中添加以下代码: ``` find_package(CUDA REQUIRED) find_package(OpenCV REQUIRED) # 添加CUDA模块 if(CUDA_FOUND) set(CUDA_NVCC_FLAGS "-arch=sm_30" CACHE STRING "nvcc flags" FORCE) set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -O3" CACHE STRING "nvcc flags" FORCE) set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++11" CACHE STRING "nvcc flags" FORCE) file(GLOB CUDA_SOURCES ${PROJECT_SOURCE_DIR}/src/*.cu) cuda_add_library(my_lib ${CUDA_SOURCES}) target_link_libraries(my_lib ${CUDA_LIBRARIES}) endif() # 添加OpenCV模块 if(OpenCV_FOUND) include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(my_executable ${PROJECT_SOURCE_DIR}/src/main.cpp) target_link_libraries(my_executable ${OpenCV_LIBS}) endif() ``` 上述代码会使用`find_package`命令查找CUDAOpenCV。如果找到了它们,我们就可以添加CUDA模块OpenCV模块了。 3. 在添加CUDA模块时,我们使用了`cuda_add_library`命令将所有CUDA源文件编译成一个动态链接库。这个库可以被其他代码使用,并且我们使用了`target_link_libraries`命令将CUDA库链接到我们的可执行文件中。 4. 在添加OpenCV模块时,我们使用了`include_directories`命令将OpenCV的头文件路径添加到我们的项目中,并使用了`target_link_libraries`命令将OpenCV库链接到我们的可执行文件中。 5. 最后,你可以使用`cmake`命令生成你的项目文件并进行编译。如果一切顺利,你的项目将包含CUDAOpenCV模块。 注意:在编译CUDA代码时,需要指定你的GPU架构。上述代码中使用的是`-arch=sm_30`,你需要根据你的GPU架构进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值