4

AVFoundation を使用してビデオをキャプチャし、OpenCV を使用して iPhone で画像処理を行っています。ただし、OpenGL シェーダーを使用して 192x144 グレースケール イメージで計算 (畳み込み) を行うことを検討しています。

私の質問は次のとおりです: OpenGL を使用するのは理にかなっていますか? つまり、IplImage へのレンダリングが遅すぎませんか (可能ですか?)。または、畳み込みを高速化する方法はありますか?

編集

OpenCVでは、私は使用しています

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

cvMorphologyEx

4

2 に答える 2

7

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に対して行ったように、実行する特定のカーネルに最適化された独自のカスタム実装を作成することを選択できます。

于 2012-05-07T03:01:20.677 に答える
1

これに関する関連資料を見つけることができなかったので、このアルゴリズムのシェーダーを使用した実装が 192x144 のような小さな画像でより優れたパフォーマンスを発揮するかどうかを確実に言うことは不可能だと思います.

これは複雑な実装ではないため、時間があれば、両方の実装のパフォーマンスの向上を測定することをお勧めします。

この道を進むことにした場合は、結果を報告してください。

于 2012-05-06T23:17:39.343 に答える