8

任何人都可以推荐一个非常快速的 API,最好是 NEON 优化,以便在运行时使用 CPU在 iPhone 上进行 YUV 到 RGB 转换?可悲的是,加速框架的 vImage 没有提供任何合适的东西,并且使用 vDSP,转换为浮点数和返回似乎不是最理想的,几乎与自己编写 NEON 一样多。

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

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

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

(3) 在 iPad 上,我有一个备用核心坐在那里无所事事。

虽然有许多库可以将 YUV 转换为 RGBA,但我希望节省编写自己的 NEON 版本的时间。现在我正在使用 OpenCV 的实现,如下所示:

cv::cvtColor(avFoundationYUVCaptureMat, BGRAInputImage, CV_YUV420sp2BGRA, 4);

这是正确的,但结束的日子很慢。

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

谢谢,亚历克斯。

4

2 回答 2

4

如果您有Y, U,V在不同的平面上并且没有色度下采样,那么您应该可以使用它vImageMatrixMultiply_Planar8来进行转换。

于 2012-10-03T00:09:13.783 回答
2

我所做的只是谷歌yuv rgb neon,这就是我发现的 - https://code.ros.org/trac/opencv/browser/trunk/opencv/android/android-jni/jni/yuv2rgb_neon.c?rev=4083

正如评论所述,它仍然很粗糙,您可能必须对其进行调整以转换为 RGBA,但这很容易。

据我所知,NEON 博客上应该还有其他此类功能 - 查看 hilbert-space、webshaker、arm 软件启用博客等

于 2012-06-30T05:26:24.377 回答