小编Ale*_*ier的帖子

使用CPU在iOS上进行最快的YUV420P到RGBA转换

任何人都可以推荐一个真正快速的API,理想的NEON优化用于在iPhone上使用CPU在运行时进行YUV到RGB转换吗?令人遗憾的是,加速框架的vImage没有提供任何合适的东西,并且使用vDSP,转换为浮点数和返回看起来不是最理想的,几乎和我自己编写NEON一样多.

我知道如何通过着色器使用GPU,事实上已经这样做了,用于显示我的主视频平面.不幸的是,我还需要在运行时创建并保存显示的子区域的RGBA纹理.这个问题的大部分好答案都涉及着色器,但我不想将GPU用于额外的工作,因为:

(1)虽然我可以使用RenderTextures和我的YUV着色器来转换和缓存区域,但我不想为应用添加任何更多的同步/复杂性.(我已经将纹理从CVTextureCache传递到Unity3D ......在许多情况下,我已经在Unity3D的后面切换状态,并且不想再做任何调试...)

(2)更实际的是我正在编写一个游戏,并且没有任何GPU可供使用(因为游戏通常没有 - 我已经提供了更多关于如何在过去几年中从GPU中获取内容的演示而不是如何放东西......)

(3)在iPad上,我有一个备用核心坐在那里什么都不做.

虽然有很多图书馆可以做YUV到RGBA,但我很乐意节省编写自己的NEON版本的时间.现在我正在使用这样的OpenCV实现:

cv::cvtColor(avFoundationYUVCaptureMat, BGRAInputImage, CV_YUV420sp2BGRA, 4);
Run Code Online (Sandbox Code Playgroud)

这是正确的,但结束日期缓慢.

如果有人以前看过其他实现(CoreImage?FFMpeg?)并且可以推荐一个我会非常感激.

谢谢,亚历克斯.

iphone opencv core-image ios accelerate-framework

8
推荐指数
1
解决办法
3245
查看次数

在存在相机抖动的情况下检测基准标记

当用户猛烈地移动相机(手机)时,我正试图使基于OpenCV的基准标记检测更加稳健.标记是ArTag风格,黑色边框内嵌有汉明码.通过对图像进行阈值处理来检测边界,然后根据找到的轮廓查找四边形,然后检查四边形的内部.

通常,如果识别黑色边界,则标记的解码相当稳健.我尝试过最明显的事情,即对图像进行两次下采样,并在这些级别上执行四次检测.这有助于相机在极端近地标记上散焦,并且还有非常小的图像模糊水平,但对于相机运动模糊的一般情况并没有太大帮助

是否有关于使检测更加稳健的方法的研究?我想知道的想法包括:

  1. 您可以进行某种光流跟踪来"猜测"下一帧中标记的位置,然后在这些猜测的区域中进行某种角点检测,而不是将矩形搜索视为全帧阈值处理吗?
  2. 在PC上,是否可以导出模糊系数(可能通过注册检测到标记的最近视频帧)并在处理之前对图像进行去模糊?
  3. 在智能手机上,是否可以使用陀螺仪和/或加速度计来获得去模糊系数并对图像进行预处理?(我假设没有,只是因为如果是这样的话,市场上会充斥着纠错相机应用程序.)

失败的想法的链接也将受到赞赏,如果它节省我尝试它们.

opencv computer-vision augmented-reality

7
推荐指数
1
解决办法
3026
查看次数

cvFindContour()的更快替代品

轮廓检测占用了我计算机视觉中的大部分时间,而且需要更快.我已经通过NEON指令和矢量化优化了其他所有内容,实际上,轮廓检测在配置文件中占主导地位.不幸的是,对我来说如何优化这一点并不明显.

我正在进行经典的矩形检测过程以找到基准标记,即cvFindContours(),然后从轮廓中逼近正方形.在许多标记可见的情况下(或灾难性的,当可以看到非标记的密集矩形网格时),单独调用cvFindContours()在iPhone上可能需要> 30ms.

我已经用cvFindContours()替换了非常昂贵的C++ cv :: FindContours().特别是如果传递了一个vector>,那么C++版本花费的分配和填充向量比其内部cvFindContours()花费的时间更长!

现在,我完全被cvFindContours中的时间束缚,或者更具体地说是cvFindNextContour().cvFindNextContour中的代码是分支密集的,并且显然不容易向量化.它还实现了一个复杂的算法,我不相信自己不会在任何优化尝试中出错.

我已经查看了cvBlobLib(用于歧义,我的意思是这个:http://code.google.com/p/cvblob/),看它是否提供了可以更快地做同样事情的替代算法.源的基本下载非常慢,因为它将轮廓记录到std :: list()中,并且几乎所有时间都花在内存分配上.使用预先调整为256个元素的std :: vector替换该列表以消除push_back()上的初始副本仍会使您的函数比cvFindContours()长3倍,其中66%直接在cvb :: cvLabel中( ).所以走这条路似乎不太可行.

有没有人对如何优化多个矩形的检测有任何想法.我模糊的handwaving包括:

  1. 有没有相当于cvFindContour()的快速实现,理想情况下作为源代码,因为我是多平台,在那里?

  2. 大多数轮廓不是必需的,只有"成功"的矩形才有用.特别是,它们的内部轮廓无用.理论上,我根本不能调用cvFindContours,而是调用cvStartFindContours/cvFindNextContour,测试找到的每个轮廓,如果找到一个我正在寻找的矩形,则不会递归,因为子矩形会被保证无用吗?

  3. 我可以使用经典的FindContours()/ ApproxPoly()方法使用完全不同的矩形检测算法吗?

  4. 有没有办法用有用的感兴趣区域"引导"cvFindContours?例如,即使具有非常激进的阈值,快速角点检测几乎总是返回我的基准标记角.有没有办法使用该点集来限制检测?(不幸的是,我不确定这有多大帮助,在许多标记的情况下,或者与标记无关的密集网格线,这在我的应用程序中经常发生.)

  5. 与上面相同,由于Blob检测可以(如果我理解正确)实现为递归泛洪填充,是否有任何快速矢量化实现,然后可以用于某种方式拉出有趣的Blob矩形,并种子轮廓检测从那里?

任何想法都会受到欢迎!

opencv arm computer-vision augmented-reality

6
推荐指数
1
解决办法
4013
查看次数