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

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

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

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

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

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

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

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

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

OpenCV离散傅里叶变换

核心代码如下:

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

2.opencl核函数编译失败

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

  1. [ INFO:0] Specify OPENCV_OPENCL_CACHE_DIR configuration parameter to enable OpenCL cache
  2. OpenCL program build log: core/fft
  3. Status -11: CL_BUILD_PROGRAM_FAILURE
  4. -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
  5. BC-src-code:429:12: error: '__local' can only appear in __kernel functions at function scope
  6. __local CT smem[LOCAL_SIZE];
  7. ^
  8. BC-src-code:499:12: error: '__local' can only appear in __kernel functions at function scope
  9. __local CT smem[LOCAL_SIZE];
  10. ^
  11. BC-src-code:558:12: error: '__local' can only appear in __kernel functions at function scope
  12. __local CT smem[LOCAL_SIZE];
  13. ^
  14. BC-src-code:644:12: error: '__local' can only appear in __kernel functions at function scope
  15. __local CT smem[LOCAL_SIZE];
  16. ^
  17. 4 diagnostic(s) generated.

出错的代码是:

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

  1. ocl::Kernel k(kernel_name.c_str(), ocl::core::fft_oclsrc, options);
  2. if (k.empty())
  3. 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. TensorFlow.NET机器学习入门【3】采用神经网络实现非线性回归

    上一篇文章我们介绍的线性模型的求解,但有很多模型是非线性的,比如: 这里表示有两个输入,一个输出. 现在我们已经不能采用y=ax+b的形式去定义一个函数了,我们只能知道输入变量的数量,但不知道某个变量 ...

  2. AcWing03. 完全背包问题

    有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用. 第\(i\)种物品的体积是\(v_i\),价值是\(w_i\). 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量, ...

  3. JAVA结合WebSocket实现简单客服聊天功能

    说明:该示例只简单的实现了客服聊天功能. 1.聊天记录没有保存到数据库中,一旦服务重启,消息记录将会没有,如果需要保存到数据库中,可以扩展 2.页面样式用的网上模板,样式可以自己进行修改 3.只能由用 ...

  4. 【LeetCode】83. Remove Duplicates from Sorted List 解题报告(C++&Java&Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 判断相邻节点是否相等 使用set 使用列表 递归 日 ...

  5. 【LeetCode】417. Pacific Atlantic Water Flow 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/pacific- ...

  6. 【LeetCode】889. Construct Binary Tree from Preorder and Postorder Traversal 解题报告(Python & C++)

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

  7. netty系列之:从零到壹,搭建一个SOCKS代理服务器

    目录 简介 使用SSH搭建SOCKS服务器 使用netty搭建SOCKS服务器 encoder和decoder 建立连接 ConnectHandler 总结 简介 上一篇文章,我们讲到了netty对S ...

  8. 防止 jar 包被反编译

    1.隔离Java程序 最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式.例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问 ...

  9. [opencv]利用minAreaRect计算平面矩形的旋转角度

    #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include ...

  10. 决策树之PEP(悲观剪枝)

    引用这2篇文章 https://blog.csdn.net/taoqick/article/details/72818496 https://www.open-open.com/lib/view/op ...