如何在iPhone上提升OpenCV性能?

我正在使用AVFoundation捕获视频以及OpenCV在iPhone上进行图像处理.但是,我正在考虑使用OpenGL着色器在192×144灰度图像上进行计算(卷积).

我的问题是:使用OpenGL是否有意义,我的意思是:不会渲染到IplImage(甚至可能吗?)太慢了?或者,有没有办法加速卷积?

编辑

在OpenCV中,我正在使用

IplConvKernel* kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);

与cvMorphologyEx.

即使通过诸如Accelerate框架(OpenCV目前不使用,如果我没有遗漏某些东西)之类的东西使用NEON向量操作,在运行简单的3×3卷积内核时,很难击败着色器的性能.例如,我可以使用着色器在iPhone 4上以2.5毫秒的速度在640×480视频帧上运行Sobel边缘检测内核,这对于实时图像处理来说已经足够快了.此外,OpenGL ES着色器在处理显示时具有显着的优势,因为您可以在整个过程中保留GPU端的所有内容,并避免为绘图事件进行昂贵的数据传输.

如果你想要一个简单的方法,我的开源GPUImage框架有一些非常快速的内置卷积,如Sobel边缘检测或图像锐化内核,它可以让你很容易地创建自己的3×3卷积内核.它为你包装了所有的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所做的那样.

相关文章
相关标签/搜索