2012-04-04 107 views
0

我正在为iOS的图像处理应用程序工作,并且我的应用程序的各个阶段之一是基于矢量的图像拼版/颜色检测。现在,我已经编写了代码,可以按像素来确定分色的颜色,但是如果iOS处理器处理图像中的每个像素,我认为对于处理器来说都是非常困难的。因此,我想知道是否可以使用图形处理器。iOS CGImageRef像素着色器

我想创建一种“像素着色器”,它使用OpenGL-ES或其他渲染技术快速处理和张贴图像。我不知道从哪里开始(我已经为Unity3D编写了简单着色器,但从未为它们编写底层编程)。

任何人都可以指向正确的方向吗?

回答

2

我打算来这边,并建议您试试Brad Larson的GPUImage framework,它将自己描述为“BSD授权的iOS库,可让您将GPU加速的滤镜和其他效果应用于图像,实时相机视频,和电影“。我没有使用它,并假设你需要做一些GL阅读来添加你自己的过滤器,但它会处理很多样板文件,并提供了很多预先打包的过滤器,所以它绝对值得研究。这听起来不像你对OpenGL特别感兴趣,所以没有真正的理由去研究它。

我会加上一个唯一的考虑,即在iOS 4下,我发现在CPU上工作的速度通常比在GPU上快得多(我使用GCD在核心之间分配),而我需要能够读取结果结束任何类型的串行访问。这是因为OpenGL通常被设计为可以上传图像,然后将其转换为任何想要的格式,并且如果您想读取它,则会将其转换回您希望接收的格式并将其复制到其中你想要它。所以你在GPU上保存的是你所支付的,因为GL驱动程序必须分流和重新安排内存。从iOS 5开始,Apple推出了一种特殊的机制,可以让您直接访问OpenGL的纹理存储库,这可能不再成为问题。

+2

在某些时候,我需要基准处理时间交叉点作为输入数据大小的函数,特别是如果考虑加速作为并行化CPU上的某些操作的手段。我认为我在iOS 4.0上处理来自GPU上的CGImage或UIImage的640x480帧与优化的CPU绑定功能的整体胜利,但我需要为此生成一些硬编码。单独转换到Core Graphics类型和单独转换比纹理上传慢得多,所以这对我来说更是一个瓶颈。 – 2012-04-05 17:40:20

+0

我的CPU例程永远不会达到Core Graphics;它们用于实时相机输入,因此可直接在相机返回的'CVPixelBuffer'上操作。我在上一次WWDC巡回赛中与Alan Schaffer进行了一次快速问答,他似乎承认,虽然iOS 5的面部检测需要GPU合作,但由于来回成本的原因,没有公共API适合重新实现。当时我并没有意识到新的核心视频相关机制,它可以有效地为您提供直接的纹理内存访问,因此未对其进行讨论。 – Tommy 2012-04-05 18:59:29

+0

是的,直接使用OpenGL ES中的相机帧可以比任何CPU绑定的速度快得多。为了在640x480图像上进行简单的棕褐色调调整,我可以在iPhone 4(2.5 ms,带有iOS 5.0纹理缓存)的情况下以6 ms的速度从捕捉到显示,CPU上的任何内容都不会靠近。就面部检测而言,完全基于GPU的OpenGL ES 2.0实现非常有趣:http://fileadmin.cs.lth.se/graphics/theses/projects/facerecognition/。在某些时候,我想尝试一下。 – 2012-04-05 19:34:01