OpenCV之OpenCL介绍

来源:互联网 发布:2017淘宝注册用户数 编辑:程序博客网 时间:2024/06/06 09:38

人工智能研究网

欢迎访问 www.studyai.cn
这里写图片描述

啥是OpenCL

OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。计算机视觉中的许多算法可以运行在GPU比CPU更有效:如图像处理,矩阵运算,计算摄影、目标检测等。

OpenCV使用OpenCL的历史

OpenCV中使用OpenCL进行加速的历史是从 2011 年开始的. Opencv 2.4.3的发行版中包含了一个新的“ocl module”, 这个模块包含了一些现有的OpenCV算法的OpenCL实现。这意味着, 当OpenCL运行时环境以及一个兼容的计算设备比如GPU或DSP在你的计算机上存在且可用的时候, 你可以使用 cv::ocl::resize() 而不是 cv::resize() 来加速你的代码. 从2011年开始的这几年里,越来越多的函数被添加到ocl模块,但是在OpenCV2.4.x中ocl模块的API与原始的CPU-oriented API是分离并存的.

OpenCV3.x中的架构已经改为 Transparent API (T-API).在新的架构中分离存在的ocl module 已经被移除了,ocl函数成为与原始的CPU函数一模一样的调用借口。当条件成熟时,OpenCV会自动调用ocl的对应函数分支,不需要像OpenCV2.4.x那样显式的指定。 The T-API implementation was sponsored by AMD and Intel companies.

性能测试

这里写图片描述

代码范例

  • 一般CPU代码

         // initialization    VideoCapture vcap(...);    CascadeClassifier fd("haar_ff.xml");    Mat frame, frameGray;    vector faces;    for(;;){      // processing loop      vcap >> frame;      cvtColor(frame, frameGray, BGR2GRAY);      equalizeHist(frameGray, frameGray);      fd.detectMultiScale(frameGray, faces, ...);      // draw rectangles …      // show image …    }
  • OpenCV-2.x中的OpenCL代码

             // initialization        VideoCapture vcap(...);        ocl::OclCascadeClassifier fd("haar_ff.xml");        ocl::oclMat frame, frameGray;        Mat frameCpu;        vector faces;        for(;;){          // processing loop          vcap >> frameCpu;          frame = frameCpu;          ocl::cvtColor(frame, frameGray, BGR2GRAY);          ocl::equalizeHist(frameGray, frameGray);          fd.detectMultiScale(frameGray, faces, ...);          // draw rectangles …          // show image …        }
  • OpenCV-3.x中的OpenCL代码段
    // initialization    VideoCapture vcap(...);    CascadeClassifier fd("haar_ff.xml");    UMat frame, frameGray;    vector faces;    for(;;){      // processing loop      vcap >> frame;      cvtColor(frame, frameGray, BGR2GRAY);      equalizeHist(frameGray, frameGray);      fd.detectMultiScale(frameGray, faces, ...);      // draw rectangles …      // show image …    }
1 0
原创粉丝点击