1.使用了UMat,但是并未使用GPU计算

cv::dft()函数的定义是:

void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )

dft()函数中这样调用opencl的版本:

#ifdef HAVE_OPENCL
CV_OCL_RUN(_dst.isUMat() && _src0.dims() <= 2,
ocl_dft(_src0, _dst, flags, nonzero_rows))
#endif

然后程序在ocl_dft()函数的如下位置返回false:

    // if is not a multiplication of prime numbers { 2, 3, 5 }
if (ssize.area() != getOptimalDFTSize(ssize.area()))
return false;

于是突然领悟了:为什么opencl版本调用的时候比CPU版本还要更慢?因为程序并未返回内部的状态,如果opencl调用失败,就会转到CPU版本去计算。但是传入的数据是UMat,导致CPU版本还要从设备内存下载数据到主机内存,必然更慢。

然后找到了这篇帖子解决了上面条件判断返回false的问题:

OpenCV离散傅里叶变换

核心代码如下:

Mat padded;                            //expand input image to optimal size
int m = getOptimalDFTSize( I.rows );
int n = getOptimalDFTSize( I.cols ); // on the border add zero values
copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0)); Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
Mat complexI;
merge(planes, 2, complexI); // Add to the expanded another plane with zeros dft(complexI, complexI); // this way the result may fit in the source matrix

2.opencl核函数编译失败

继续往后执行,debug版本opencv输出以下信息:

[ INFO:0] Specify OPENCV_OPENCL_CACHE_DIR configuration parameter to enable OpenCL cache
OpenCL program build log: core/fft
Status -11: CL_BUILD_PROGRAM_FAILURE
-D LOCAL_SIZE=36 -D kercn=12 -D FT=float -D CT=float2 -D RADIX_PROCESS=fft_radix4_B3(smem,twiddles+0,ind,1,9);fft_radix3_B4(smem,twiddles+3,ind,4,12);fft_radix3_B4(smem,twiddles+11,ind,12,12); -D COMPLEX_INPUT -D COMPLEX_OUTPUT
BC-src-code:429:12: error: '__local' can only appear in __kernel functions at function scope
__local CT smem[LOCAL_SIZE];
^
BC-src-code:499:12: error: '__local' can only appear in __kernel functions at function scope
__local CT smem[LOCAL_SIZE];
^
BC-src-code:558:12: error: '__local' can only appear in __kernel functions at function scope
__local CT smem[LOCAL_SIZE];
^
BC-src-code:644:12: error: '__local' can only appear in __kernel functions at function scope
__local CT smem[LOCAL_SIZE];
^
4 diagnostic(s) generated.

出错的代码是:

bool enqueueTransform(InputArray _src, OutputArray _dst, int num_dfts, int flags, int fftType, bool rows = true) const

        ocl::Kernel k(kernel_name.c_str(), ocl::core::fft_oclsrc, options);
if (k.empty())
return false;

我的android手机是opencl 2.0版本,暂不清楚opencv开发者所用的fft.cl对应的opencl版本是什么。由此说明之前并没有人在android下去做opencl版本的dft()函数的兼容。

下一步是认真分析fft.cl的语法,想办法在android下可以编译通过。

===================================

2019-06-26 20:48补充:

核函数这里解决了:

'__local' can only appear in __kernel functions at function scope

声明为__local的变量,只能定义在函数的顶级作用域,例如写在if()里面是不行的。

因此,把所有if, for 等括号里面的__local变量定义放在函数开始处就解决了。

opencv中的ocl_dft()终于跑起来了!

【失败经验分享】android下使用支持opencl的cv::dft()的更多相关文章

  1. linux下编译支持opencl的opencv for android

    主要的步骤其他人已经写过,请参考这篇:https://www.cnblogs.com/hrlnw/p/4720977.html 操作的细节请参考附件的pdf:  https://files.cnblo ...

  2. android+opencv+opencl: cv::dft()的opencl版本的性能分析

    在小米mix 2s + 高通骁龙 845 + Adreno 630 上测试了opencl版本的cv::dft(). 测试数据 先看表格里面的描述: 名称 函数名 最大时间(ms) 平均时间(ms) 说 ...

  3. Android 多媒体视频播放一( 多媒体理解与经验分享)

    前言 说到android的多媒体,一把辛酸一把泪,当初听说会多媒体的比较牛掰,公司也有需求,于是乎我也积极的加入研究android多媒体的行列,记得以前刚接触的时候,最开始还是比较头大的,主要是但是很 ...

  4. 犀利点评:csdn某文<第一次创业还是失败了---分享失败的经验>

    今天上午在csdn看了一篇创业文,突然想无节操的做一下点评. 原文详细地址如下:http://blog.csdn.net/android_tutor/article/details/9815801 以 ...

  5. Java程序员转Android开发必读经验分享

    小编最近几日偷偷的发现部分Java程序员想转安卓开发,故此加紧补充知识,为大家搜集资料,积极整理前人的经验,希望可以给正处于困惑中的你,带来些许的帮助. 啰哩啰嗦的说说Java和Android程序的区 ...

  6. Android内存优化解决 资料和总结的经验分享

    在前公司做一个图片处理的应用时, 项目交付的时候,客户的手机在运行应用的时候,一直在崩溃,而这个异常就是OutOfMemory的错误,简称为OOM, 搞得我们也是极其的崩溃,最后 ,我们是通过网上搜集 ...

  7. android平台短视频技术之 视频编辑的经验分享.

    android平台短视频技术之 视频编辑的经验分享. 提示一: 各位看官,这里分享的是视频编辑,即剪切/拼接/分离/合并/涂鸦/标记/叠加/滤镜等对视频的编辑操作.不是流媒体网络播放等功能,请注意. ...

  8. 漏洞经验分享丨Java审计之XXE(下)

    上篇内容我们介绍了XXE的基础概念和审计函数的相关内容,今天我们将继续分享Blind XXE与OOB-XXE的知识点以及XXE防御方法,希望对大家的学习有所帮助! 上期回顾  ◀漏洞经验分享丨Java ...

  9. Unity技术支持团队性能优化经验分享

    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247490321&idx=1&sn=f9f34407ee5c5d ...

随机推荐

  1. AOP——面向切面编程

    目录 什么是AOP AOP的作用和优势 作用: 优势: AOP相关术语 AOP的实现方式 使用动态代理的方式 使用XML的方式 使用注解的方式 什么是AOP AOP:全称是Aspect Oriente ...

  2. 网站高可用架构之BASE原理

    BASE理论是eBay架构师提出的. BASE定理来源:是CAP中一致性和可用性的权衡结果,它来自大规模互联网分布式系统的总结,是基于CAP定理逐步演化而来的. BASE定理的核心思想:即使无法做到强 ...

  3. 通过go调用bat解决乱码核心代码

    背景:通过go写的程序调用dos命令(如dir c:),返回值往往有中文,默认会出现乱码. 解决:转码. 代码:GO package shellLib import ( "golang.or ...

  4. 使用react搭建组件库:react+typescript+storybook

    前期准备 1. 初始化项目 npx create-react-app react-components --template typescript 2. 安装依赖 使用哪种打包方案:webpack/r ...

  5. 网络编程之UDP(1)高效低销

    读书笔记 from here 高效 Linux系统有用户空间(用户态)和内核空间(内核态)之分,内核与用户空间发生切换比较耗时,内核需要保存上下文.执行用户态数据.再恢复到保存的上下文. 实际中,应该 ...

  6. c++之sigslot库

    关于 本文演示环境: win10 + VS2017 1. demo #include <iostream> #include "sigslot.h" using nam ...

  7. 【LeetCode】931. Minimum Falling Path Sum 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 相似题目 参考资料 日期 题目地址:htt ...

  8. 1018 - Brush (IV)

    1018 - Brush (IV)    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Muba ...

  9. MADE: Masked Autoencoder for Distribution Estimation

    目录 概 主要内容 代码 Germain M., Gregor K., Murray I. and Larochelle H. MADE: Masked Autoencoder for Distrib ...

  10. centos6.5-搭建Apache-地址限制和用户访问

    对于企业内部的WEB管理平台,例如日志分析系统(Awstats)为了更好实现访问控制,在通过客户端访问时,提交一些用户密码或对客户IP地址进行授权,避免服务器的安全隐患. 常见的访问控制方式:应用于配 ...