【失败经验分享】android下使用支持opencl的cv::dft()
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()的更多相关文章
- linux下编译支持opencl的opencv for android
主要的步骤其他人已经写过,请参考这篇:https://www.cnblogs.com/hrlnw/p/4720977.html 操作的细节请参考附件的pdf: https://files.cnblo ...
- android+opencv+opencl: cv::dft()的opencl版本的性能分析
在小米mix 2s + 高通骁龙 845 + Adreno 630 上测试了opencl版本的cv::dft(). 测试数据 先看表格里面的描述: 名称 函数名 最大时间(ms) 平均时间(ms) 说 ...
- Android 多媒体视频播放一( 多媒体理解与经验分享)
前言 说到android的多媒体,一把辛酸一把泪,当初听说会多媒体的比较牛掰,公司也有需求,于是乎我也积极的加入研究android多媒体的行列,记得以前刚接触的时候,最开始还是比较头大的,主要是但是很 ...
- 犀利点评:csdn某文<第一次创业还是失败了---分享失败的经验>
今天上午在csdn看了一篇创业文,突然想无节操的做一下点评. 原文详细地址如下:http://blog.csdn.net/android_tutor/article/details/9815801 以 ...
- Java程序员转Android开发必读经验分享
小编最近几日偷偷的发现部分Java程序员想转安卓开发,故此加紧补充知识,为大家搜集资料,积极整理前人的经验,希望可以给正处于困惑中的你,带来些许的帮助. 啰哩啰嗦的说说Java和Android程序的区 ...
- Android内存优化解决 资料和总结的经验分享
在前公司做一个图片处理的应用时, 项目交付的时候,客户的手机在运行应用的时候,一直在崩溃,而这个异常就是OutOfMemory的错误,简称为OOM, 搞得我们也是极其的崩溃,最后 ,我们是通过网上搜集 ...
- android平台短视频技术之 视频编辑的经验分享.
android平台短视频技术之 视频编辑的经验分享. 提示一: 各位看官,这里分享的是视频编辑,即剪切/拼接/分离/合并/涂鸦/标记/叠加/滤镜等对视频的编辑操作.不是流媒体网络播放等功能,请注意. ...
- 漏洞经验分享丨Java审计之XXE(下)
上篇内容我们介绍了XXE的基础概念和审计函数的相关内容,今天我们将继续分享Blind XXE与OOB-XXE的知识点以及XXE防御方法,希望对大家的学习有所帮助! 上期回顾 ◀漏洞经验分享丨Java ...
- Unity技术支持团队性能优化经验分享
https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247490321&idx=1&sn=f9f34407ee5c5d ...
随机推荐
- 介绍下Shell中的${}、##和%%使用范例,本文给出了不同情况下得到的结果。
介绍下Shell中的${}.##和%%使用范例,本文给出了不同情况下得到的结果.假设定义了一个变量为:代码如下:file=/dir1/dir2/dir3/my.file.txt可以用${ }分别替换得 ...
- windows10 c++获取本机IPv4,ipv6,查询本机Ipv4,ipv6
1.关于 演示环境: win10+VS2017 2.支持 需要下面的库支持: ws2_32.lib 需要下面的宏,添加到项目属性-> c/c++ -> 预处理器定义 _WINSOCK_DE ...
- 【LeetCode】1222. Queens That Can Attack the King 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...
- 【LeetCode】766. Toeplitz Matrix 解题报告
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:两两比较 方法二:切片相等 方法三:判断每条 ...
- 【LeetCode】221. Maximal Square 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址: https://leet ...
- Discrete Logging(poj2417)
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5120 Accepted: 2319 ...
- TSS任务状态段
TSS (任务状态段)的作用及结构 1.什么是TSS TSS全称Task State Segment ,是操作系统在进行进程切换时保存进程现场信息的段 2.TSS什么时候用,有什么用 TSS在任务 ...
- FineGAN
目录 概 主要内容 隐变量 背景 轮廓 色彩和纹理 用于无监督分类 代码 Singh K., Ojha U. & Lee Y. FineGAN: Unsupervised Hierarchic ...
- [算法笔记-题解]问题 B: 例题4-2 比较交换实数值
问题 B: 例题4-2 比较交换实数值 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 12 MB 题目描述 从键盘输入2个实数,按照代数值由小到大的顺序输出这两个数. 输入 ...
- CS5210设计HDMI to VGA方案|CS5210资料|CS5210设计电路方案
CS5210是一款HDMI转VGA转换器方案,其输出VGA信号可送到CRT/LED显示器,及投影机等,输入HDMI信号可以驳接电脑.PS3,XBOX360.蓝光DVD,输出VGA可以CRT/LED显示 ...