OpenCV2实时图像处理在Windows下的优化

来源:互联网 发布:撮合交易 算法 编辑:程序博客网 时间:2024/06/07 10:55
        最近项目里用到OpenCV,USB摄像头采集图像,并实时分析画面中的人脸和身体。配置好环境运行起来,发现运行速度并不满足需求,于是针对Windows系统进行了一下优化:


软件版本:
opencv-2.4.10.exe
cuda_6.5.14_windows_general_64.exe
tbb43_20141023oss_win.zip
cmake-3.1.0-rc2-win32-x86.exe


1、通过DirectShow采集图像
    VideoCapture采集图像实在是慢,虽然VideoCapture capture(CV_CAP_DSHOW & devid) 可以将采集模式设定为 CV_CAP_DSHOW    =700,   // DirectShow (via videoInput),或CV_CAP_MSMF     =1400,  // Microsoft Media Foundation (via videoInput)。


    自己写个Sample Graber filter,可以让采集速度加快很多。参考DirectShow的例子,百度一下“USB摄像头采集图像(DirectShow)”。


    注意媒体格式设置为MEDIASUBTYPE_RGB24,读取数据直接写到Mat里。


pMediaEvent->WaitForCompletion(INFINITE, &evCode);
pSampleGrabber->GetCurrentBuffer(&size, NULL);


if (size != bufferSize)
{
_mat.release();
bufferSize = size;
_mat = cv::Mat(cv::Size(width, height), CV_8UC3);//CV_8UC3和MEDIASUBTYPE_RGB24是匹配的
}


pSampleGrabber->GetCurrentBuffer(&size, (long*)_mat.data);//直接写入Mat里


return _mat;


2、采集速度快了(60帧以上),但处理速度并不高。没办法,用GPU加速一下。于是新买一块小影霸GTX 750 Ti。(淘宝上有很便宜的GTX 750,买了一块发现是奸商用gts 450刷的,没办法退掉了。)


一定要买nvidia支持CUDA并且Compute Capability高的显卡。计算能力看https://developer.nvidia.com/cuda-gpus。GeForce GTX 750和Ti计算能力是5.0,性价比比较高的。


重新编译OpenCV,还是用2.4吧,3.0有些蛋疼,估计还不完善。为了用DirectShow,选择32位;64位不知道怎么用DirectShow。


先配置 CMAKE
Source Colde: D:/Project/BaoTuQuan/opencv2.4.10/sources
Build the binaries: D:/Project/BaoTuQuan/opencv2.4.10/rebuild_vc12_x64
选择:Visual Studio 12 2013 Win64    Default


配置 CUDA 选项
        - 取消 ‘BUILD_DOCS’ and ‘BUILD_EXAMPLES’
        - 取消 ‘CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE’
        - 检查 ‘CMAKE_LINKER’, 保证是 Visual Studio 12.0 (vs2013)
        - 选上 ‘WITH_CUBLAS’, ‘WITH_CUDA’, ‘WITH_OPENGL’, ‘WITH_TBB’
        - 点击 Configure 刷新配置
     配置 TBB 选项
        - 把 tbb include path 设置好,一定要选到 include文件夹为止。
        - 点击 Configure 刷新
        - 接着可以看到 tbb 的 library 目录自动有了,但是可能是错的,需要改到 Debug 和 Release 文件夹的上级目录为止。例如我的要加上vc12
        - 点击 Configure 刷新


     直到没有红色条目出现,点击 Generate 生成 OpenCV.sln


然后编译 OpenCV.sln
先编译 *opencv_core* 和 ‘ opencv_gpu* (右键点击,点 *BUILD*)。


使用的时候需要加入TBB的bin和CUDA的bin


3、现在可以测试代码了。 


gpu::GpuMat gsrc, gflip,ggray,grect;//GpuMat相当于Mat,但它在GPU运行。


gsrc.upload(_mat);//上传Mat到gpu


gpu::flip(gsrc, gflip, -1);//在gpu中翻转


gflip.download(_mat);//下载到Mat(上传下载好像耽误时间,flip也可以在CPU中做,效率也差不多的。)
gpu::cvtColor(gflip, ggray, CV_BGR2GRAY);//在gpu中转灰度图


const int face_count = _cascade.detectMultiScale(ggray, grect, 1.1, 4, Size(5, 5));//CascadeClassifier_GPU count是检测到Face的数量




if (face_count>0)
{
cv::Mat downloaded(grect);//下载检测数据
const cv::Rect* faces = downloaded.ptr<cv::Rect>();//转为Rect


for (int i = 0; i < face_count; i++)//遍历数据
{
cv::Rect r = faces[i];
 


先优化这些吧,速度已经提升不少了。
0 0
原创粉丝点击