如何提高iPhone上OpenCV的性能?

4
我正在使用AVFoundation和OpenCV来捕获iPhone上的视频,并进行图像处理。然而,我考虑使用OpenGL着色器在192x144灰度图像上进行计算(卷积)。我的问题是:使用OpenGL是否有意义?渲染到IplImage(是否可能?)会不会太慢?或者说,有没有一种方法可以加速卷积过程?
编辑:在OpenCV中,我正在使用
IplConvKernel* kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);

使用cvMorphologyEx进行形态学操作。

如果您的卷积核是对称的,那么您可以实现可分离版本(先行后列),这比朴素版本涉及的计算要少得多。在Pentium 3移动设备时代,我可以使用此算法进行更大图像的实时卷积(小内核支持)。也许您可以明确一下您正在执行什么样的卷积? - sansuiso
@sansuiso,我刚刚更新了问题。 - user961912
2个回答

7
即使使用NEON矢量操作,例如加速框架(OpenCV目前没有使用,如果我没有遗漏什么的话),也很难在运行简单的3x3卷积核时击败着色器的性能。例如,我可以在iPhone 4上使用着色器在640x480视频帧上运行Sobel边缘检测内核,耗时2.5毫秒,这已经足够快以进行实时图像处理。此外,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所做的那样。

谢谢回复。我忘记提到我主要是在OpenCV中对灰度16x16 ROI进行卷积。我尝试了你的框架,但它似乎假定图像为RGB格式(我错了吗?)。问题:从CPU到GPU(反之亦然)的内存复制会不会消耗资源呢?(我不确定)。 - user961912
@user961912 - 您可以使用彩色或灰度图像。如果您查看我的Sobel滤波器,实际上我首先通过亮度滤波器将图像转换为灰度,然后在该通道的红色通道上执行过滤。如果您的源图像已经是灰度图像,则可以省略灰度转换步骤。 - Brad Larson
关于你的问题,如果你看一下框架的运作方式,在iOS 5.0上它直接从AV Foundation将数据路由到OpenGL ES,速度非常快。如果你想要保存图像数据,我提供了对iOS 5.0上OpenGL ES纹理的直接访问,这也很快。我的iOS 4.0回退使用略慢的代码,但即使如此,上传/下载时间也不会减缓整个过程,以至于无法与CPU处理相媲美。 - Brad Larson
我已经意识到我正在使用OpenGL ES进行渲染(游戏)。当我查看GPUImage的源代码时,它也(令人惊讶地)初始化了OpenGL。因此,重新编写源代码并在每个帧中更改OpenGL的程序(我的意思是使用glUseProgam())以呈现场景和卷积图像是否有意义(且有效)? - user961912
我正在渲染游戏,并同时使用AVFoundation捕获视频并尝试进行卷积,但我不知道在GPU上执行这两个操作的其他方法,除了通过glUseProgram()更改着色器(一个用于游戏,另一个用于卷积)。 P.S .:对我的糟糕英语感到抱歉。 - user961912
显示剩余3条评论

1

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

由于这不是一个复杂的实现,如果您有时间,我鼓励您去做并测量两种实现的性能提升。

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


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