我想分析来自 iPhone 相机的不断更新的图像馈送,以确定一般的“亮度系数”。含义:如果系数返回 0.0,则图像全黑,如果返回 1.0,则图像全白。当然,介于两者之间的所有值都是我最关心的值(背景信息:我正在使用此系数来计算片段着色器中某些混合效果的强度)。
所以我想知道我是否应该在我的像素缓冲区上运行一个 for 循环并分析每帧(30 fps)的图像并将 coeff 作为统一发送到我的片段着色器,或者有没有办法在 OpenGL 中分析我的图像。如果是这样,我该怎么做?
我想分析来自 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()));
当然还有 OpenCL,它允许您使用 GPU 进行一般处理。