我想分析来自iPhone相机的不断更新的图像供稿,以确定一般的“亮度系数”。含义:如果系数返回0.0,则图像为全黑;如果系数为1.0,则图像为全白。当然,介于两者之间的所有值都是我最关心的值(背景信息:我正在使用此系数来计算片段着色器中某些混合效果的强度)。

因此,我想知道是否应该在像素缓冲区上运行for循环并每帧(30 fps)分析图像并将coeff作为制服发送给片段着色器,或者是否可以在OpenGL中分析图像。如果是这样,我该怎么做?

最佳答案

还有更多答案,每个答案各有优缺点。

在CPU上,这非常简单:循环遍历像素,将其求和,除,就这样。这是五分钟的工作。好的实施将需要几毫秒的时间。

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


在GPU上,它可能会快得多,但是有一些缺点:第一个是将所有内容放置到位所需的工作量。 GPUImage框架将为您节省一些工作,但同时也会添加很多代码。如果您只想对像素求和,那可能是浪费。第二个问题是,将像素发送到GPU可能比将它们加到CPU中要花费更多。实际上,仅当您确实需要认真处理时,GPU才会证明工作合理。

第三种选择是将CPU与库一起使用,其缺点是您需要为10行代码添加大量代码。但是结果将是美丽的。再次说明,如果您还将lib用于其他任务,则可以证明。这是OpenCV中的一个示例:

cv::Mat frame(buffer, width, height, channels, type);
double avgLuminance = cv::sum(frame)/(double(frame.total()*frame.channels()));

10-07 19:13
查看更多