1

一般的な「明度係数」を決定するために、iPhone カメラからの絶えず更新される画像フィードを分析したいと思います。意味: 係数が 0.0 を返す場合、画像は完全に黒くなり、1.0 を返す場合、画像は完全に白になります。もちろん、その間のすべての値は、私が最も気にかけている値です (背景情報: この係数を使用して、フラグメント シェーダーでブレンド効果の強度を計算しています)。

したがって、ピクセルバッファに対して for ループを実行し、フレームごと (30 fps) に画像を分析し、coeff を均一としてフラグメント シェーダに送信するか、OpenGL で画像を分析する方法があるかどうか疑問に思っています。もしそうなら、どうすればいいですか?

4

2 に答える 2

2

より多くの答えがあり、それぞれに長所と短所があります。

CPUでは、それはかなり単純です。ピクセルを循環し、それらを合計し、分割し、それだけです。それは5分の仕事です。適切な実装では、数ミリ秒かかります。

int i, sum = 0, count = width * height * channels;
for(i=0;i<count;i++)
    avg += buffer[i];
double avg = double(sum) / double(count);

GPUでは、はるかに高速になる可能性がありますが、いくつかの欠点があります。1つは、すべてを適切に配置するために必要な作業量です。GPUImageフレームワークを使用すると、作業をいくらか節約できますが、多くのコードも追加されます。ピクセルを合計するだけの場合は、無駄になる可能性があります。2番目の問題は、GPUにピクセルを送信すると、CPUでピクセルを合計する以上の時間がかかる可能性があることです。実際、GPUは、深刻な処理が本当に必要な場合にのみ、作業を正当化します。

ライブラリでCPUを使用する3番目のオプションには、10行で実行できることに対して多くのコードを追加するという欠点があります。しかし、結果は美しいでしょう。繰り返しますが、他のタスクにもlibを使用するかどうかは正当化されます。OpenCVの例を次に示します。

cv::Mat frame(buffer, width, height, channels, type);
double avgLuminance = cv::sum(frame)/(double(frame.total()*frame.channels()));
于 2012-08-22T08:08:02.180 に答える
-1

もちろん、一般的な処理に GPU を使用できる OpenCL もあります。

于 2012-08-21T09:47:52.380 に答える