4

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

我的问题是:使用 OpenGL 是否有意义,我的意思是:渲染到 IplImage 中(甚至可能吗?)太慢了吗?或者,有没有一种方法可以加快卷积速度?

编辑

在 OpenCV 中,我正在使用

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

cvMorphologyEx.

4

2 回答 2

7

即使通过 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 所做的那样。

于 2012-05-07T03:01:20.677 回答
1

我无法找到任何相关材料,所以我想无法确定使用该算法的着色器的实现是否会对像 192x144 这样的小图像有更好的性能。

由于这不是一个复杂的实现,如果您有时间,我鼓励您这样做并衡量两种实现的性能增益。

如果您决定走这条路,请向我们报告您的发现。

于 2012-05-06T23:17:39.343 回答