访客24998

文章72

字数278298

粉丝16

啥是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.

性能测试


代码范例

  1. 一般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 …
    }


  1. 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 …
        }

  • 2.  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 …
    }


 收藏 (0)  打赏  点赞 (2)
powerd by studyai.com 2017