即使通过 Accelerate 框架(OpenCV 目前不使用它,如果我没有遗漏什么)使用 NEON 矢量操作,在运行简单的 3x3 卷积内核时,也很难超越着色器的性能。例如,我可以在 iPhone 4 上使用着色器在 2.5 毫秒内对 640x480 帧视频运行 Sobel 边缘检测内核,这对于实时图像处理来说已经足够快了。此外,OpenGL ES 着色器在处理显示时具有显着优势,因为您可以将所有内容始终保留在 GPU 端,并避免绘制事件的昂贵数据传输。
如果你想要一个简单的方法来做到这一点,我的开源GPUImage框架有一些非常快速的内置卷积,比如 Sobel 边缘检测或图像锐化内核,它可以让你很容易地创建自己的 3x3 卷积内核。它为您包装了所有 OpenGL ES,因此您无需了解任何相关信息(除非您想编写自己的自定义效果,但即便如此,您也只需要了解一点 GLSL)。
例如,要仅执行 Sobel 边缘检测内核的 X 分量,您可以使用以下代码设置卷积滤波器:
GPUImage3x3ConvolutionFilter *filter = [[GPUImage3x3ConvolutionFilter alloc] init];
[filter setConvolutionKernel:(GPUMatrix3x3){
{-1.0f, 0.0f, 1.0f},
{-2.0f, 0.0f, 2.0f},
{-1.0f, 0.0f, 1.0f}
}];
然后,您只需将其附加到相机、图像或电影输入和显示、原始数据或电影录像机输出,框架将处理其余部分。为了获得最佳性能,您可以选择编写自己的自定义实现,该实现针对您要运行的特定内核进行了优化,就像我为 GPUImageSobelEdgeDetectionFilter 所做的那样。