android Opencv 基于 Float 而不是 Double

Posted

技术标签:

【中文标题】android Opencv 基于 Float 而不是 Double【英文标题】:android Opencv based on Float instead of Double 【发布时间】:2014-07-31 06:44:56 【问题描述】:

浮点运算(与双精度相比)在 arm 架构上要快得多,除了 NEON 不支持双精度。那么为什么 opencv4android 不基于 float 而不是 double 来提供更好的性能呢?

作为更好性能的一个例子,我可以提到 warpPerspective (ImgProc)。它太慢了(大约 100 毫秒),但后来我根据浮点数创建了自己的版本,瞧,它只花了 5 毫秒。(不是作为 opencv 的一部分重建,而是作为我自己的 app/lib 的一部分)

我不能基于 float 分叉和构建我自己的 opencv 版本,因为我会失去一些闭源优化的优势,根据我的测试,这非常重要。 (我自己构建的 opencv(带有很多优化标志)导致 warpPrespective 需要 200-300 毫秒!)

【问题讨论】:

你的问题听起来更像是一个答案。 这应该在这里问:answers.opencv.org/questions 【参考方案1】:

这是代码可维护性和性能优化之间进行工程权衡的经典示例。

针对一组目标进行了极端性能优化的代码(因此与原始源代码有很大差异)通常无法针对另一组目标进行重新优化。

人们必须回到最初的“干净、可维护”的源代码版本,并开始新的极限性能优化工作。

近年来,ARM 架构(和 NEON 加速)的性能发生了很大变化,其方式超出了经验丰富的行业分析师的预期。所以,请给 OpenCV 一些爱,考虑到软件世界中没有多少人具备在 OpenCV 中开发 SIMD 代码的全部技能,请认真思考您可以为 OpenCV 做出贡献的方式。

提醒一下,典型的warpPerspective(用于 SSE2 管道,不确定是否适用于 NEON 管道)由两个步骤组成。第一步,从透视矩阵生成子采样坐标矩阵,格式类似于convertMaps的输出。第二步,使用第一步的采样坐标矩阵从输入图像中采样(插值)输出矩阵中的每个像素值,类似于remap 的工作原理。

选择此实施策略是有原因的,但显然该决定是在十多年前根据当时可用的硬件做出的。值得注意的是,ARM-NEON 架构可能对这种策略的选择没有任何影响。

(当时,没有人会考虑使用 OpenCV 对 32768 x 32768 像素的图像进行去扭曲处理;首选是一些小众的 GIS 成像软件。情况已经发生了变化。)

【讨论】:

以上是关于android Opencv 基于 Float 而不是 Double的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV,Android:从图像中检测对象而不是实时检测

使用android sdk而不是opencv的人脸识别

基于OpenCV 图像处理的Android 找茬App 设计与实现

Android基于opencv4.6.0实现人脸识别功能

Android OpenCV之基于均值实现图像二值分割

Android OpenCV之基于均值实现图像二值分割