关于VS2010+cuda4.2+opencv2.4.3的配置

本文详细记录了作者通过配置CUDA和OpenCV在笔记本电脑上实现GPU加速的人脸检测过程,从选择合适的CUDA版本、配置环境、下载安装到最终成功运行代码,实现了约27fps的帧频提升,显著提高了检测效率。

前一段时间做了些人脸检测的工作,对opencv中的分类器算法很感兴趣,但是cpu下速度很慢,几乎半秒一帧,实在无法忍受,于是后来做了些肤色加分类器的工作,由于不是计算机专业出身(本人是学光学工程的。。。),所以优化代码水平十分不足,准确率和速度根本无法兼顾。前几天查到资料说opencv2.2版本之后就已经加入了基于cuda的GPU加速,于是决定做一下实验。

整个过程花费了我几乎一周的时间,事实上这一周我有时间就忙活这个,自己的实验和论文校正都被搁置在一边,各种google,今天下午终于成功了!——我说的是配置成功了,因为我觉得这个东西实在是太难配置了。

我先描述下我这几天的工作,我办公室的电脑没有显卡,于是我之前用我的很挫很挫的笔记本做实验(09年买的Y450,装了好几个版本的cuda,发现它支持的最高版本是3.2),需要指出的是,cuda3.2和opencv2.2是匹配的,但是opencv2.2刚开始加入了gpu功能,所以它的函数很少,对于我这样基础不好的,几乎没有什么应用价值。所以虽然我花了一天的时间使用CMake重新编译了opencv的dll们,而且可以使用,但是我还是决定不使用这个“低端”的组合。

于是昨天开始到楼下实验室的电脑上“搞破坏”,我合计上次弄得组合太低端,这回我直接玩高级的吧,于是下了个cuda5.5,(我没下cuda6.0就不错了),下载完一看这都什么乱七八糟的啊,网上也没有教程教我怎么和opencv配合呀,就告诉我cmake这是闹哪样!!其实cuda5.5是在六维下载的,我就是图它下载的快。

英伟达的官网下东西好慢呀,我花了几乎半天的时间,下载了业界最看好的组合,就是cuda4.2+opencv2.4.3组合,这个组合可以保证你不用自己cmake,因为opencv2.4.3的build里已经事先cmake好了。

言归正题吧~


这两篇文章对我的帮助很大

点击打开链接

点击打开链接

比较重要的提示:如果你之前装过别的版本的cuda,那么一定要卸载干净,我之前按照这两篇博文所描述的方法没有配置成功,还搞死机了,已经到了系统还原的地步,不过还原到一个月前的存档点之后,再按照这些方法就成功了,不知道我遇到的是否是特例。。

首先根据自己电脑的配置到这里下载cuda4.2点击打开链接  toolkit driver SDK都要下载

实验室的电脑是64位台式机,所以下载之后的是这些



这几个程序没有严格的安装顺序。

当我安装driver的时候,弹出提示,无法找到兼容的图形硬件。


参考了这篇文章,但是并不完全,我们的显卡是GTX760,对应的是1187,所以打开C:\NVIDIA\DisplayDriver\301.32\WinVista_Win7_64\English\Display.Driver路径下的nv_disp.inf文件,记事本打开修改。可以去这里查看之间的对应关系。

 然后安装opencv2.4.3,到官网下载,然后解压。

接下来按照前面提到的两篇文章来添加和移动一些dll和lib文件:(注意x64与x86的区别)

1、dll文件:NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin中的cudart64_42_9.dll,cufft64_42_9.dll,npp64_42_9.dll 以及D:\ OpenCV2.4.3\opencv\build\gpu\x64\vc10\bin中的所有dll文件,全部复制并替换到D:\OpenCV2.4.3\opencv\build\x64\vc10\bin中,然后一定记得要在环境变量中的path中添加D:\OpenCV2.4.3\opencv\build\x64\vc10\bin这个路径

2、lib文件:将D:\OpenCV2.4.3\opencv\build\gpu\x64\vc10\lib中的lib们复制替换到D:\OpenCV2.4.3\opencv\build\x64\vc10\lib中。


至此为止,配置工作基本完成了,接下就是VS2010中的include和lib和附加依赖项的配置了,这些网上有很多资料。再次简单叙述一下:

include添加

D:\OpenCV2.4.3\opencv\build\include

lib添加

D:\OpenCV2.4.3\opencv\build\x64\vc10\lib

附加依赖项添加(存在记事本里,每次都这些,够偷懒的~)

opencv_calib3d243d.lib
opencv_contrib243d.lib
opencv_core243d.lib
opencv_features2d243d.lib
opencv_flann243d.lib
opencv_gpu243d.lib
opencv_highgui243d.lib
opencv_imgproc243d.lib
opencv_legacy243d.lib
opencv_ml243d.lib
opencv_objdetect243d.lib
opencv_ts243d.lib
opencv_video243d.lib


然后就可以运行这个代码


#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/gpu/gpu.hpp>
#include <vector>

using namespace std;
using namespace cv;
using namespace cv::gpu;

void main()
{
	string cascadeName = "haarcascade_frontalface_alt.xml";
	CascadeClassifier_GPU cascade_gpu;
	VideoCapture capture(0);
	if(!capture.isOpened()) return;

	int gpuCnt = getCudaEnabledDeviceCount();   // gpuCnt >0 if CUDA device detected
	cout<<gpuCnt<<endl;
	if(gpuCnt==0) return;

	if(!cascade_gpu.load(cascadeName))
	return;

	Mat frame;

	while(true)
	{
		capture >> frame;
		double t = (double)getTickCount();

		GpuMat faces;
		Mat frame_gray;
		cvtColor(frame, frame_gray, CV_BGR2GRAY);
		GpuMat gray_gpu(frame_gray);
		equalizeHist(frame_gray,frame_gray);

		int detect_num = cascade_gpu.detectMultiScale(
		gray_gpu, faces,
		1.2, 4, Size(20, 20) );
		Mat obj_host;
		faces.colRange(0, detect_num).download(obj_host);

		Rect* cfaces = obj_host.ptr<Rect>();
		

		for(int i=0;i<detect_num;++i)
		{
			Point pt1 = cfaces[i].tl();
			Size sz = cfaces[i].size();
			Point pt2(pt1.x+sz.width, pt1.y+sz.height);
			rectangle(frame, pt1, pt2, Scalar(255),3,8,0);
		}
		
		t=((double)getTickCount()-t)/((double)cvGetTickFrequency()*1000.);
		cout<<t<<"  ms     "<<1000/t<<"  fps"<<endl;
		imshow("faces", frame);
		if(waitKey(1)==27) break;
	}
}

我得到了大约27fps的帧频,速度相当满意,下一周可以以此开始实验了。

欢迎交流~

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值