近期编译了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. 多线程多进程学习threading,queue线程安全队列,线程间数据状态读取。threading.local() threading.RLock()

    http://www.cnblogs.com/alex3714/articles/5230609.html python的多线程是通过上下文切换实现的,只能利用一核CPU,不适合CPU密集操作型任务, ...

  2. Raft论文概述

    介绍 Raft是一种为了管理复制日志的一致性算法.为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如领导人选举.日志复制和安全性.同时它通过实施一个更强的一致性来减少需要考虑的状态的数 ...

  3. Semaphore信号量源码解析

    介绍 Semaphore是什么 Semaphore可以称为信号量,这个原本是操作系统中的概念,是一种线程同步方法,配合PV操作实现线程之间的同步功能.信号量可以表示操作系统中某种资源的个数,因此可以用 ...

  4. JAVA接收postman的中raw的参数

    /** * java获取raw */ public static String readRaw(InputStream inputStream) { String result = "&qu ...

  5. 【LeetCode】246. Strobogrammatic Number 解题报告(C++)

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

  6. 深度探索 OpenStack Neutron:BGP(1) 【转载】

    3.4 BGP 原文地址:http://mp.weixin.qq.com/s?src=3&timestamp=1500043305&ver=1&signature=XwiIVV ...

  7. G2022 次列车即将进站,前端人请抓紧时间上车

    前端发展百花放,一技未熟百技出.未知何处去下手,关注小编胜百书. 我是前端人,关注小编,分享更多前端相关知识! 平安夜一个人?圣诞一个人? 跨年还是一个人吗? 没事,关注小编,每个节日让小编陪你一起度 ...

  8. CS5263|DP转HDMI转换器芯片|CS5263芯片说明

    CS5263是一款高性能DP1.4到HDMI2.0b功能芯片,设计用于将DP1.4源连接到HDMI2.0b接收器.CS5263集成了DP1.4兼容接收机和HDMI2.0b兼容接收机发射器.DP接口包括 ...

  9. 2021前端面试css(三)

    overflow 原理 块格式化上下文是css可视化渲染的一部分,它是一块区域,规定了内部块盒的渲染方式,以及浮动相互之间的影响关系,当元素设置了overflow 样式且值不为visible时,元素就 ...

  10. centos6.5-svn搭建文档

    下载相关软件 wget http://subversion.tigris.org/downloads/subversion-1.6.6.tar.gz wget http://subversion.ti ...