【问题标题】:Get luminance from iOS camera从 iOS 相机获取亮度
【发布时间】:2013-01-24 06:56:33
【问题描述】:

我想从相机获取亮度,我已经检查了解决方案(计算平均亮度) obtaining-luminosity-from-an-ios-camera

但是相机会自动设置曝光,所以如果将相机转向光源(例如灯泡),那么在第一次亮度非常高,但过了一段时间这个值会变低,因为曝光设置被改变了。我已经测试了锁定曝光,但这不是一个好的解决方案,因为如果在来自相机的图像较暗时锁定曝光,那么很少的光源被视为非常高的值。有什么方法可以获得亮度的绝对值吗? 我检查了应用光检测器,这个应用运行良好,曝光改变了,但亮度值稳定。

问候亚当

【问题讨论】:

  • 也许它结合了曝光设置(假设您可以阅读此内容)和测量的亮度来估计绝对亮度。
  • 同时我已经检查了它的方向是好的,我们可以读取曝光设置,但关键是如何正确组合曝光设置
  • 使用反复试验来构建应用插入的查找表。
  • 另外,您可能想尝试更快的基于 GPU 的方法,而不是迭代 CPU 上的每个像素(这可能有点慢):stackoverflow.com/questions/12168072/…

标签: ios camera average brightness


【解决方案1】:

你知道如何创建一个自定义 Core Image 过滤器来返回 CIKernel(或 CIColorKernel)对象的输出吗?如果没有,你应该;而且,我很乐意为您提供易于理解的说明。

假设你这样做了,这里的 OpenGL ES 代码将只返回它处理的图像的亮度值:

vec4 rgb2hsl(vec4 color)
{
    //Compute min and max component values
    float MAX = max(color.r, max(color.g, color.b));
    float MIN = min(color.r, min(color.g, color.b));

    //Make sure MAX > MIN to avoid division by zero later
    MAX = max(MIN + 1e-6, MAX);

    //Compute luminosity
    float l = (MIN + MAX) / 2.0;

    //Compute saturation
    float s = (l < 0.5 ? (MAX - MIN) / (MIN + MAX) : (MAX - MIN) / (2.0 - MAX - MIN));

    //Compute hue
    float h = (MAX == color.r ? (color.g - color.b) / (MAX - MIN) : (MAX == color.g ? 2.0 + (color.b - color.r) / (MAX - MIN) : 4.0 + (color.r - color.g) / (MAX - MIN)));
    h /= 6.0;
    h = (h < 0.0 ? 1.0 + h : h);

    return vec4(h, s, l, color.a);
}

kernel vec4 hsl(sampler image)
{
    //Get pixel from image (assume its alpha is 1.0 and don't unpremultiply)
    vec4 pixel = unpremultiply(sample(image, samplerCoord(image)));

    //Convert to HSL; only display luminance value
    return premultiply(vec4(vec3(rgb2hsl(pixel).b), 1.0));
}

以上是苹果开发者原创的OpenGL ES代码;我将其修改为仅显示亮度值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2019-11-28
    • 2012-02-14
    • 1970-01-01
    相关资源
    最近更新 更多