使用OpenGL ES 2.0在iOS上裁剪(与使用Core Image相比)

3
我在寻找有关在iPhone或iPad上使用OpenGL ES裁剪图像的文档方面遇到了困难。具体而言,我以相对快速的速度(20 FPS)捕获视频帧,并需要一个可以快速裁剪图像的工具。在这里使用OpenGL可行吗?如果是这样,它是否比使用Core Image及其相关方法进行裁剪更快?使用Core Image方法似乎无法实现10-12 FPS以上的输出速度,我正在寻找一种达到20 FPS的方法。你有什么建议或指向使用OpenGL进行此操作的指针吗?

不必自己编写所有的OpenGL ES代码,你可能想看看这个:https://github.com/BradLarson/GPUImage。特别是,GPUImageCropFilter应该可以满足你的需求。 - Brad Larson
@BradLarson 嗨,我仔细研究了你的代码,我必须说我对你的工作印象非常深刻。 我唯一不确定的是关于使用你的实现时它是否适用于实时视频流 - 因为它被归类为图像滤波器。 我不确定它是否打算用于我需要的方式。 你认为它可以这样使用吗? 绝对可以帮我省去很多麻烦。 - anon_dev1234
1
它的唯一目的是对来自相机的实时视频进行操作。我在这里有一些基准测试:https://dev59.com/Vmw15IYBdhLWcg3wbLHU#6628208(我需要更新iOS 6.0)。构建并运行FilterShowcase示例,以查看其在实时视频中的性能。裁剪滤镜可能是其中最快的,因此它应该可以在iPhone 4上裁剪和记录720p视频,帧率约为25-30 FPS,并且在4S及以上设备上以稳定的30 FPS记录1080p视频。 - Brad Larson
哇,太棒了。我甚至不需要720p的视频,我正在使用352x288的预设来缩小图像大小。你真是我的救星! - anon_dev1234
@BradLarson,实际上经过了很多的尝试和测试,我不知道GPUImage是否有所帮助。人脸检测会使设备变得太慢。我没有裁剪静态区域 - 它是动态的,并由CIFaceDetector结果确定。如果您在样本中注意到人脸检测,当渲染时框的帧率很慢。我认为这只是CIFaceDetector的缓慢性,而不是我正在进行的任何图像操作。这很悲惨,但没关系 :( - anon_dev1234
是的,Core Image人脸检测逻辑相当慢,但您仍然可以根据场景中上次已知的面部位置实时裁剪。不幸的是,我自己的面部检测逻辑还没有运作。 - Brad Larson
1个回答

3
显然,使用OpenGl ES比使用Core Image框架更快。裁剪图像将通过设置纹理坐标来完成,通常情况下,纹理坐标始终如下:
{
0.0f,1.0f,
1.0f,1.0f,
0.0f,0.0f,
1.0f.0.0f
}

整张图片将使用纹理坐标进行绘制。如果您只想要图像的右上部分,可以设置纹理坐标如下:
{
0.5f,1.0f,
1.0f,1.0f,
0.5f,0.5f,
1.0f.0.5f
}

这将在右上角获取整张图片的四分之一。请记住,OpenGl ES的坐标原点位于左下角。

好的,现在假设我已经从CIFaceDetector计算出了一个矩形,我想我只需要规范化坐标?我从未真正使用过OpenGL,所以您能指点我一些资源,让我可以查看如何从旧纹理和一组坐标实际呈现新纹理吗? - anon_dev1234
1
@bgoers 是的,你首先需要将从CIFaceDetector获取的矩形规范化到纹理的原始大小,然后就可以得到纹理坐标。如何使用OpenGl ES渲染纹理,你可以参考我的开源程序Camera,链接为https://github.com/zhzhy/Camera,或者从developer.apple.com下载演示程序,例如RosyWriter、GLCameraRipple等。这些程序将帮助你熟悉OpenGl ES的用法。 - zhzhy
谢谢。我会看看的。我需要花一些时间来学习OpenGL以理解一些函数! - anon_dev1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接