iphone - 如何提高 iPhone 上的 OpenCV 性能?

标签 iphone performance opengl-es opencv convolution

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

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

编辑

在 OpenCV 中,我正在使用

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

使用cvMorphologyEx

最佳答案

即使通过 Accelerate 框架之类的东西使用 NEON 矢量操作(OpenCV 目前不使用,如果我没有遗漏某些东西的话),在运行简单的 3x3 时也很难超越着色器的性能卷积核。例如,我可以在 iPhone 4 上使用着色器在 640x480 视频帧上以 2.5 毫秒运行 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 所做的那样。

关于iphone - 如何提高 iPhone 上的 OpenCV 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466217/

相关文章:

ios - 在 IOS 上显示 YUV(yuv420p) 不正确

iPhone SDK : how to play music and record from the mic at the same time?

ios - 使用 JsonModel 解析 json

ios - Objective-C - 将 JSON 数据从 Tableview 传递到另一个 View Controller

iPhone 开发盒?

javascript - 这是一个好的服务器负载平衡系统吗?

performance - ORM 解决方案(JPA;Hibernate)与 JDBC

c# - .NET 交叉程序集性能下降

Android,各向异性过滤?

ios - iOS 上保存的图像上的 OpenGL ES 结果不正确(部分透明边缘为黑色)