您的位置:首页 > 运维架构

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

2017-02-20 23:12 696 查看
 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

 





#include <opencv2/opencv.hpp>  

#include <opencv2/gpu/gpu.hpp>  

using namespace cv;  

using namespace cv::gpu;  

  

int main()  

{  

    int num_devices = cv::gpu::getCudaEnabledDeviceCount();  

    if(num_devices <= 0)  

    {  

        std::cerr<<"There is no device. "<<std::endl;  

        return -1;  

    }  

  

    std::cerr<<"getCudaEnabledDeviceCount NUM :"<<num_devices<<std::endl;  

      

  

    cv::Mat srcImage = cv::imread("M:\\work\\Pic\\cityWu.jpg");  

    cv::Mat dstImage;  

    cv::gpu::GpuMat d_srcImage;//upload image to GPU  

    cv::gpu::GpuMat d_dstImage;  

    d_srcImage.upload(srcImage);  

    cv::gpu::GpuMat dst;  

    dst.create(d_srcImage.size(),CV_8UC1);  

    cv::gpu::cvtColor(d_srcImage, d_dstImage, CV_BGR2GRAY);  

    d_dstImage.download(dstImage);  

    cv::imshow("RGB",srcImage);  

    cv::imshow("gray",dstImage);  

    cv::waitKey(0);  

    return 0;  

}  

运行结果:



序曲:
由于我的电脑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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: