VS2010 + CUDA7.5 + GPU编译OpenCV2.4.9

 opencv2.4.9调用GPU报错


OpenCV Error:Gpu API call<invalid device symbol>in unknown function…

WIN7 + VS2010 + CUDA7.5 + CMake3.0.2

Cmake 重新编译opencv之后,显示编译成功。


代码:num_devices= cv::gpu::getCudaEnabledDeviceCount();

返回 num_devices 个数为1.


但是运行测试代码以及opencv自带的gpu sample时会报错.

OpenCV Error:Gpu API call<invalid device symbol>in unknown function…





问题分析:

这是由于编译好的CUDA不支持本机GPU的原因,本机GPU型号为GeForce GT 602,计算能力为2.1(关于gpu型号对应的计算能力,参考https://developer.nvidia.com/cuda-gpus),而Cmake编译的时候,由于"CUDA_GENERATION" = Kepler. 所以默认生成的计算能力为3.0和3.5 。所以在调用opencv的GPU函数时会出现Gpu API call<invalid devicesymbol>in unknown function….的错误。

解决方案:

将"CUDA_GENERATION"= Auto.或者"CUDA_GENERATION" = Fermi.


测试运行成功:

测试代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <opencv2/opencv.hpp>  
  2. #include <opencv2/gpu/gpu.hpp>  
  3. using namespace cv;  
  4. using namespace cv::gpu;  
  5.   
  6. int main()  
  7. {  
  8.     int num_devices = cv::gpu::getCudaEnabledDeviceCount();  
  9.     if(num_devices <= 0)  
  10.     {  
  11.         std::cerr<<"There is no device. "<<std::endl;  
  12.         return -1;  
  13.     }  
  14.   
  15.     std::cerr<<"getCudaEnabledDeviceCount NUM :"<<num_devices<<std::endl;  
  16.       
  17.   
  18.     cv::Mat srcImage = cv::imread("M:\\work\\Pic\\cityWu.jpg");  
  19.     cv::Mat dstImage;  
  20.     cv::gpu::GpuMat d_srcImage;//upload image to GPU  
  21.     cv::gpu::GpuMat d_dstImage;  
  22.     d_srcImage.upload(srcImage);  
  23.     cv::gpu::GpuMat dst;  
  24.     dst.create(d_srcImage.size(),CV_8UC1);  
  25.     cv::gpu::cvtColor(d_srcImage, d_dstImage, CV_BGR2GRAY);  
  26.     d_dstImage.download(dstImage);  
  27.     cv::imshow("RGB",srcImage);  
  28.     cv::imshow("gray",dstImage);  
  29.     cv::waitKey(0);  
  30.     return 0;  
  31. }  

运行结果:



序曲:

由于我的电脑GPU型号为NVIDIA GeForce GT 620,计算能力为2.1, (查看计算能力 网址

首先我将"CUDA_GENERATION"= Auto,编译,生成。

但是在OpenCV.sln中生成opencv_core时,会报错,错误为:

1. CMakeError at cuda_compile_generated_bf_knnmatch.cu.obj.cmake:206 (message):

>C:\ProgramFiles (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5):error MSB6006: “cmd.exe”已退出,代码为 1。

即会有一个生成失败。

为了解决这个错误,

我将"CUDA_GENERATION" = Fermi. 

将CUDA_ARCH_BIN 设为2.0 2.1

将CUDA_ARCH_PTX清空,编译,生成。

然后,在OpenCV.sln中生成opencv_core,生成成功!!!



将我的错误以及改正过程贴出来,希望遇到同样情况的你,可以有所帮助!

切记:一定要注意查找好本机GPU的类型和计算能力,再生成相应的CUDA.




参考文章:

http://stackoverflow.com/questions/22823186/opencv-gpu-mat-hanging

https://developer.nvidia.com/cuda-gpus

http://blog.csdn.net/wangyaninglm/article/details/39997113

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值