より多くの答えがあり、それぞれに長所と短所があります。
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()));