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

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

2014-04-05 17:08 471 查看
前一段时间做了些人脸检测的工作,对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的帧频,速度相当满意,下一周可以以此开始实验了。

欢迎交流~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: