Accelerateフレームワーク(OpenCVは現在使用していませんが、何かが足りない場合)のようなものを介してNEONベクトル操作を使用しても、単純な3x3畳み込みカーネルを実行する場合のシェーダーのパフォーマンスに勝るものはありません。たとえば、シェーダーを使用して、iPhone4で2.5ミリ秒で640x480フレームのビデオでSobelエッジ検出カーネルを実行できます。これは、リアルタイムの画像処理に十分な速度です。また、OpenGL ESシェーダーには、表示用に処理するときに大きな利点があります。これは、GPU側のすべてを完全に保持し、描画イベントの高価なデータ転送を回避できるためです。
これを簡単に行う方法が必要な場合は、私のオープンソースGPUImageフレームワークに、Sobelエッジ検出や画像シャープニングカーネルなどの非常に高速な畳み込みが組み込まれており、独自の3x3畳み込みカーネルを非常に簡単に作成できます。すべてのOpenGLESをラップするので、それについて何も知る必要はありません(独自のカスタム効果を作成したい場合を除きますが、そこでも少し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に対して行ったように、実行する特定のカーネルに最適化された独自のカスタム実装を作成することを選択できます。