2012-05-05 88 views
4

我使用AVFoundation與OpenCV一起捕獲視頻以在iPhone上執行圖像處理。但是,我正在考慮使用OpenGL着色器在192x144灰度圖像上進行計算(卷積)。如何提升iPhone上的OpenCV性能?

我的問題是:它是否有意義使用OpenGL,我的意思是:不是渲染到IplImage(它甚至可能?)太慢?或者,有沒有一種方法可以加速卷積?

編輯

在OpenCV中,我使用

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

cvMorphologyEx

+0

如果您的卷積內核是對稱的,那麼您可以實現可分離的版本(rows-then-columns),這涉及比天真版本更少的計算。回到Pentium 3移動版的日子,我可以用這種算法在較大的圖像上進行實時卷積(小內核支持)。也許你可以確切地說明你在做什麼樣的卷積? – sansuiso

+0

@sansuiso我剛剛更新了這個問題。 – user961912

回答

1

我在這方面找不到任何相關材料,所以我想不可能肯定地說如果使用這種算法的着色器的實現會像192x144這樣的小圖像具有更好的性能。

由於這不是一個複雜的實現,如果你有時間我鼓勵你這樣做,並衡量兩個實現的性能增益。

如果您決定遵循這條道路,請向我們報告您的發現。

7

即使通過類似Accelerate框架(OpenCV目前不使用,如果我沒有遺漏某些東西)使用NEON向量操作,在簡單運行時也很難擊敗着色器的性能3x3卷積核。例如,我可以使用着色器在iPhone 4上以2.5毫秒的速度在640x480幀的視頻上運行Sobel邊緣檢測內核,這對於實時圖像處理來說足夠快。此外,OpenGL ES着色器在處理顯示時具有顯着的優勢,因爲您可以將所有內容都保存在GPU端,並避免繪圖事件的昂貴數據傳輸。

如果你想要一個簡單的方法來做到這一點,我的開源GPUImage框架有一些非常快速的內置卷積,如索貝爾邊緣檢測或圖像銳化內核,它可以讓你很容易地創建自己的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所做的一樣。

+0

感謝您的回覆。我忘記提及在OpenCV中,我主要是**灰度** 16x16投資回報。我試過你的框架,但看起來,它假定圖像是RGB(我錯了嗎?)。問題:不是將內存從CPU複製到GPU(後面)消耗(我不知道)? – user961912

+0

@ user961912 - 您可以使用彩色或灰度圖像。如果你看看我的索貝爾過濾器,我實際上首先通過亮度過濾器將圖像轉換爲灰度,然後在其上的紅色通道上執行過濾。如果源圖像已經是灰度,則可以切出灰度轉換。 –

+0

@ user961912 - 至於你的問題,如果你看看框架的運行方式,在iOS 5.0上,它直接從AV Foundation路由數據到OpenGL ES,這非常快。如果您希望保存圖像數據,我可以直接訪問iOS 5.0上的OpenGL ES紋理,該紋理速度也很快。我的iOS 4.0後退使用的代碼稍慢,但即使這樣,上傳/下載時間也不會減慢整個過程,使其與CPU上的處理速度保持一致。 –