此文档记录opencv的GPU加速的准备工作的操作流程。本电脑的软硬件配置如下:win7的64位系统、opencv2.4.9、cuda6.5、vs2013、cmake3.80、显卡GT1050。转自本人的新浪博客。
准备阶段:
安装vs跟opencv就不说了。安装cuda6.5:
先用鲁大师之类的软件看看是什么显卡,然后在网上看看你的显卡是否支持cuda(https://developer.nvidia.com/cuda-gpus),其实一般的英伟达显卡都支持的了。再去下载cuda安装包(https://developer.nvidia.com/cuda-toolkit-archive),至于下载那个版本,这个不好说,我安装过9.0的,安装的时候没警告提示,安装好之后进行后面的操作时就没法正常操作,但我安装6.5的,安装时有警告,但后面的操作正常,最后就用了6.5的。当然了,版本越高就功能越完善。安装cuda时,一开始时可能有个叹号的警告的,这个不用管,直接下一步,后面有一个选择安装方式的(大概意思是选择推荐安装或者自定义安装),这里选择自定义,全部勾上就行,其他的方面,就一直按照默认来点下一步(包括路径)。
安装cmake:
直接百度找找就有了,可以安装在d盘,至于版本,我试过3.4和3.8,都行。
下载tbb:
百度云盘下载(http://pan.1hqeUYMC 密码:u4es),解压放在d盘的一个你记得的位置。
配置阶段:
解压tbb,并将其bin目录添加到环境变量中。添加环境变量之后记得要重启电脑。例如目录:D:tfilestbb41_20130613oss\bin\intel64\vc12,每个人电脑的目录都不同。
剩下的步骤按这个来http://blog.csdn.net/xuhang0910/article/details/45601035
注意:减少首次运行时间长问题:http://blog.sina.com.cn/s/blog_b1e24f1d0102wsdr.html
这一步在Generate 前加入显卡加速能力值,可以用CUDA_Z软件来检测出你的显卡计算能力值是多少。
测试:
可以把测试代码换成这个,用来比较有没有GPU加速的用时:
#include
//#include
//#include
#include
#include
int main()
{
cv::gpu::GpuMata(10, 10, CV_8U);
int64 begintime, endtime;
int num_devices = cv::gpu::getCudaEnabledDeviceCount();
if (num_devices <=0)
{
std::cerr << "There is no devoce" << std::endl;
system("pause");
return -1;
}
int enable_device_id = -1;
for (int i = 0; i < num_devices; i++)
{
cv::gpu::DeviceInfodev_info(i);
if (dev_info.isCompatible())
{
enable_device_id =i;
}
}
if (enable_device_id < 0)
{
std::cerr << "GPU module isn't built for GPU"<< std::endl;
system("pause");
return -1;
}
cv::gpu::setDevice(enable_device_id);
cv::Mat src_image= cv::imread("test.jpg");
cv::imshow("0.0",src_image);
cv::Mat dst_image;
begintime =cv::getTickCount();
cv::gpu::GpuMatd_src_img;// (src_image);//upload src image to gpu
d_src_img.upload(src_image);
cv::gpu::GpuMatd_dst_img;
cv::gpu::cvtColor(d_src_img, d_dst_img, CV_BGR2GRAY);//////////////////canny
d_dst_img.download(dst_image);//download dst image to cpu
// cv::cvtColor(src_image, dst_image, CV_BGR2GRAY);
endtime =cv::getTickCount();
cv::imshow("test",dst_image);
std::cerr << 1000*(endtime - begintime) / cv::getTickFrequency() << std::endl;
cv::waitKey(0);
return 0;
}}
采用GPU加速的时候,同样的操作(还加上了上下载)用时为7点几ms,而用常规方法,用时为27点几ms。有一个问题是,一般使用GPU加速的话,第一次调用GPU,会很慢很慢,一条简单的语句都用了10多秒左右。治标不治本的解决方法是在程序的开头加上一句cv::gpu::GpuMata(10, 10, CV_8U);,这样会令耗时的操作放在一开头,不那么影响后面的操作时间(即使加了计算能力值,也是会第一步慢点)。弄好之后,可以把opencv.sln工程清除解决方案,就可以把这个工程的大小压缩一半而不影响功能(通常是差不多10G变成5G左右)。
在其他电脑上面把重编译的文件移植到自己电脑里面:
这不需要重编译了,要做的是配置。首先自己的电脑要安装上同样版本的cuda,要有tbb文件,cmake就不需要用到了,显卡最好是同样的型号的(我移植的时候是同样的型号,不同型号不知道行不行,我觉得理论上是可以的)。
加入以下的路径到环境变量的path里面:
D:tfilestbb41_20130613oss\bin\intel64\vc12
D:\tfiles\tbb43_20150424oss\include
D:\tfiles\tbb43_20150424oss/lib/intel64
D:\tfiles\opencv-2.4.9\build-vs2013\install\x64\vc12\bin
然后把你电脑环境变量原来的opencv路径删掉,或者放到新opencv路径后面。以上需要注意的是,上面那里路径是我电脑的,你添加是根据你自己电脑的安装位置来灵活处理;你要用vs的32位编译平台,那上面那些64位路径就相应的改成32位,打开电脑的环境变量path,看看cuda那些路径有没有64的,有就改成相应的32路径(不是说直接把64改成32,而是这个路径相应的改一下),64位编译平台亦然;搞完这些环境变量,就重启电脑,开始测试有没有移植成功。参照http://blog.csdn.net/xuhang0910/article/details/45601035的cuda项目opencv配置环境下面的测试步骤。
减少首次运行时间长问题:http://blog.sina.com.cn/s/blog_b1e24f1d0102wsdr.html
在一些大的工程里面,单单添加包含GPU头文件的语句,就会出错,如图:
解决方法:在前面添加两句话,如图。
http://www.aiuxian.com/article/p-1679180.html
下面是用GPU计算特征点的opencv改造过程