即使通過類似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所做的一樣。
如果您的卷積內核是對稱的,那麼您可以實現可分離的版本(rows-then-columns),這涉及比天真版本更少的計算。回到Pentium 3移動版的日子,我可以用這種算法在較大的圖像上進行實時卷積(小內核支持)。也許你可以確切地說明你在做什麼樣的卷積? – sansuiso
@sansuiso我剛剛更新了這個問題。 – user961912