近期编译了android下支持opencl的opencv,使用opencl能力的关键是用cv::UMat替换cv::Mat。

实际使用后发现坑很多,非常不成熟,不推荐使用这种方式来提升实际产品的性能。

  • 每个UMat产生的时候会从gpu分配内存,而GPU分配内存是很慢的;使用Mat的时候,这点开销不值得一提,但是UMat完全不是一回事。因此,UMat一定一定要重用,避免反复分配。
  • mat.getUMat()方法很多坑,引用计数的错误很难查,至今没搞明白原理。因此一直用mat.copyTo(umat)来代替。
  • mat.copyTo(umat) 和 umat.copyTo(mat)也是很慢的,因此,一定要计算时间大于数据拷贝时间,抵消了拷贝的开销,使用umat才能带来性能提升。
  • 例如这样一个函数 cv::cvtColor(umat_in, umat_out),第一次使用是很慢的,因为opencl的核函数编译很耗时。因此要使用很多次,多到第一次使用的编译开销可以忽略。
  • 再说核函数编译的问题:opencv是C风格的,每次调用,核函数都要编译一次,虽然第二次以后很快,但是这种每次调用都编译一次核函数没有意义。
  • T-API看起来很好,一套API既支持Mat又支持UMat,但其中的坑是:计算到底用GPU完成的还是CPU完成的,你不知道。例如我使用cv::dft()一样,传入的UMat必须按照2的倍数对齐,否则就会退化到用CPU计算。这下大坑就来了——我先mat.copyTo(umat),然后传给cv::dft(), 函数内部检测无法用GPU计算后,自动退化成CPU计算,然后内部umat.getMat(), 计算完成后再mat.getUMat,白白多了两次GPU内存拷贝,加上外部调用又拷贝了两次,来回有四次GPU内存拷贝。
  • opencv的函数都没有提供opencl的Queue的支持,也就是所有的拷贝和计算无法让CPU和GPU做到异步。就算GPU分担了CPU的压力,但是CPU在等着GPU计算的结果。
  • 从opencl支持的源码风格上看,很可能T-API最初只在intel GPU & AMD GPU上测试,网上的android+opencv+opencl的文章也很少——由此猜测:android下的opencv中的opencl加速,可能并没有专门针对android平台去测试加速情况。没有前人证明过这条路可行!

【感受】android + opencv + umat + opencl使用感受的更多相关文章

  1. OpenCV、OpenCL、OpenGL、OpenPCL

    对于几个开源库的总结,作为标记,以前看过,现在开始重视起来!更详细资料请移步 开源中国社区! 涉及:OpenCV,OpenCL,OpenGL,OpenPCL 截止到目前: OpenGL的最新版本为4. ...

  2. WINDOWS系统Eclipse+NDK+Android + OpenCv

    WINDOWS系统Eclipse+NDK+Android + OpenCv 参考文档博客 1 NDK环境搭建 http://jingyan.baidu.com/article/5d6edee22d90 ...

  3. Android OpenCV 图像识别

    最近打算写一个android 平台opencv 的小程序,着手查找了一下资料.网络上的资料参差不齐,有一些都比较老旧,我参考了前面的方法找到了一个简单的搭建方法,分享给大家. 0,环境的搭建: jav ...

  4. Android OpenCV样例调试+报错处理

    1.OpenCV样例调试:<OpenCV Sample - image-manipulations>       blog+报错:E/CAMERA_ACTIVITY(17665): Cam ...

  5. Android+openCV 的坑

    之前一直用IntelliJ IDEA 导入 opencv_android_sdk 的 java 包,在最后一步finish时,始终出错. 后来重新安装Android Studio 重复以上步骤,能顺利 ...

  6. HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenCV和OpenCL区别

    1 扩展库简介 OpenCV(Open Source Computer Vision Library)是一个致力于实时处理计算机视觉问题的开源库.它最初由Intel公司开发,以GPL许可协议发布,后来 ...

  7. android opencv

    最近工作需求:用opencv来先做一个demo.扫描照片进行边缘检测和透视矫正. 之后会加入照片降噪等处理. 请教了一下搞图像的同事.他的提议: 1.绿盟的“黄色照片检测” 用的是动态的opencv库 ...

  8. 【OpenCV开发】使用OpenCV的OpenCL(ocl)模块

    参加OpenCV的OpenCL模块(以下称OCL)移植工作已经有2个月了.这里我说移植而不是开发,是因为大部分OCL模块的函数都是从已经很成熟的GPU模块移植过来的.于是目前阶段OCL模块所支持的函数 ...

  9. 【记录一个问题】opencv官网的opencv android sdk使用opencl并未用到GPU

    UMat u_mat;mat.copyTo(u_mat);cv::cvtColor(u_mat, cv::BGR2GARY);这样的代码反复执行,并未发现GPU占用提升.执行时间与不使用UMat相当. ...

随机推荐

  1. 初识requests

    Make a Request 一开始要导入 Requests 模块: >>> import requests 然后,尝试获取某个网页.本例子中,我们来获取 Github 的公共时间线 ...

  2. mongodb 64位操作系统下载地址

    下载地址:https://www.mongodb.org/dl/win32/x86_64

  3. 使用proxy解决请求跨域问题

    背景 在 react 项目里,前端请求接口时出现了跨域问题(类似图片中的提示) 这时最快捷的方法就是让后端同学设置请求允许跨域(如图配置响应头) 如果后端同学不配合,就需要靠我们自己来了! 实现 Re ...

  4. Spring学习(一)idea中创建第一个Spring项目

    1.前言 Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container). Sprin ...

  5. Centos(Linux)安装openoffice教程

    一.从官网下载openoffice软件 下载地址:http://www.openoffice.org/zh-cn/download/ 选择(RPM)类型进行下载,选择对应的版本,这里默认选择是最新的版 ...

  6. git 添加.gitignore文件不生效

    git rm -r --cached . #新增的忽略文件没有生效,是因为git是有缓存的,而之前的文件在缓存中,并不会清除掉,还会继续提交,所以更新.gitignore文件,要清除缓存文件 git ...

  7. cmake之引入外部项目(引用其他项目)、FetchContent管理子模块(fetchcontent用法)

    本文CMAKE版本为3.18 演示环境: Windows+CMake+VS2017 源码下载说明 演示代码是后来传上去的,而且做了些修改,将spdlog_demo由exe改为了lib,但是,spdlo ...

  8. 【LeetCode】913. Cat and Mouse 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 参考资料 日期 题目地址:https://leetc ...

  9. 【LeetCode】17. Letter Combinations of a Phone Number 电话号码的字母组合

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:电话号码, 字母组合,回溯法,题解,leetcode, ...

  10. libecc:一个可移植的椭圆曲线密码学库

    libecc:一个可移植的椭圆曲线密码学库 这段时间要写毕设关于椭圆曲线的部分,就参考了一个椭圆曲线库的代码来编写.这个库中的代码的结构.风格和封装在我看来是十分完善的.用起来也比较方便,当作一个密码 ...