【问题标题】:Android: detect brightness (amount of light) in phone's surroundings using the camera?Android:使用相机检测手机周围环境的亮度(光量)?
【发布时间】:2011-06-11 22:01:47
【问题描述】:

以下适用于 Android 操作系统。

我正在尝试使用摄像头估计手机所在房间的黑暗(或光亮)。

这个想法是相机可以返回一定的亮度水平,我可以用它来确定手机周围的光量。

我的问题很简单:如何使用摄像头(无论是前置摄像头还是后置摄像头)来获得这样的亮度(“光量”)?

提前致谢。

【问题讨论】:

  • 大多数(全部?)Android 手机都有两个用于“日光检测”的微型硬件传感器。当您将设置设置为自动控制时,这些传感器的反馈是您的手机控制显示屏亮度的方式。我想知道你是否可以利用这些数据。它会可靠很多倍。
  • 感谢 user432209,这肯定会有所帮助。我希望这个传感器(它叫什么?)是公开可用的,也许有人可以在这个问题上启发我们。

标签: java android camera brightness


【解决方案1】:

以下是在光传感器上注册监听器的方法:

private final SensorManager mSensorManager;
private final Sensor mLightSensor;
private float mLightQuantity;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Obtain references to the SensorManager and the Light Sensor
    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

    // Implement a listener to receive updates
    SensorEventListener listener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            mLightQuantity = event.values[0];
        }
    }

    // Register the listener with the light sensor -- choosing
    // one of the SensorManager.SENSOR_DELAY_* constants.
    mSensorManager.registerListener(
            listener, lightSensor, SensorManager.SENSOR_DELAY_UI);
}

编辑:感谢@AntiMatter 提出的更新建议。

文档: SensorEventListener SensorManager SensorEvent Sensor

【讨论】:

  • 太好了,这个传感器对我有很大帮助。我不确定有多少设备(尤其是较便宜的 archos 媒体播放器)实现了这个传感器,但现在可以这样做。谢谢。
  • 您可以在清单中使用<uses-feature android:name="android.hardware.sensor.light" />,而没有此传感器的设备将无法在市场上找到它。或者,您可以调用getSensorList(Sensor.TYPE_LIGHT);,然后检查列表大小是否大于 0,以通过编程方式查看设备是否具有所需的传感器。
  • 我了解 kcoppock,但我正在考虑一种替代方案来支持缺少它的设备。但是,这是我将来需要问自己的事情,因为我不确定是否需要这样做。再次感谢。
  • 我在 lightSensor.registerListener(listener); 上遇到错误 - 方法 registerListener(SensorEventListener) 未为 Sensor 类型定义
  • @AntiMatter 我已经根据您的建议更新了答案并进行了更改。 :)
【解决方案2】:

如果您想使用相机,例如如果其他传感器不可用,那么我会

  1. 将相机的自动曝光设置为关闭,并将曝光补偿设置为0
  2. 将捕获设置为最低质量/尺寸(何必多费心)
  3. 使预览窗口尽可能小(也许您甚至可以将其设置为不可见,但仍然可以得到一个框架来分析,不确定)
  4. 获取图像预览帧,但它们是 yuv 格式,因此 2.1 及更早版本需要翻译器。

然后我会计算图像亮度的直方图并从右(最亮)到左(最暗)工作,直到你找到高于 N 的第一个重要值,这将决定你的场景亮度。

说了这么多,我不会这样做,因为您需要测试很多异常情况。

当然不确定你的用例是什么,如果你用它来调整汽车的“亮度”,那么前置摄像头会受到前灯等的影响。

无论如何都是一个有趣的问题,但似乎需要做很多工作才能获得这么少的收益,尤其是在大多数体面的硬件都有这些传感器的情况下

【讨论】:

  • 关于第 3 点,根据我的经验,除非您使用 TextureView 并将其 WindowManager.LayoutParams.alpha 设置为 0,否则使相机预览窗口不可见是行不通的。
  • 关于第4点,如果您使用TextureView作为相机预览,您只需调用TextureView.getBitmap即可获取RGB的当前帧。
  • 当然,您需要 API 14(我认为是 Android 4.0)才能使用TextureView
【解决方案3】:

要想降低亮度,最重要的是要弄清楚 HTC 在他们的 camera.apk 中是如何做到的。因为库存的 Android 相机应用程序对于过度曝光来说是可怕的,尤其是对于 DINC。

【讨论】:

    【解决方案4】:

    使用相机是没有意义的,因为相机会根据周围的光线调整曝光时间和光圈,这样记录的图像就会具有非常相似的整体亮度,而不受实际可用光线的影响(至少在理想情况下是这样)。

    Android API 在 SensorManager 中提供访问硬件传感器的功能(您对 TYPE_LIGHT 类型的传感器感兴趣)。但是,我不确定您是否可以依赖通过 API 访问这些传感器,尽管它们可能存在(也可能不存在)。

    【讨论】:

    • 感谢您提供有关相机的信息,我想知道这是否确实意味着没有光传感器的设备无法通过相机估计房间的亮度(作为备用方法)。
    【解决方案5】:

    我的回答可能太不完整,无法回答,但我喜欢这里的格式。

    另外,我的回答并不搞笑,所以不要马上停止阅读。

    当然,首先你得拍张照片。然后你必须定义“亮度”。我没有这样做的算法,但我猜类似的事情已经完成了。也许是这样的:

    确定哪些像素值是亮的,哪些是暗的,以及介于两者之间的(并且它们中的每一个都可以具有可变的亮度)。然后,您必须将该算法应用于您的照片以获得亮度值。

    是的,这是对问题的一个非常简短(35,000 英尺)的看法,但它应该会给您一些关于从哪里开始的想法。

    [编辑]
    Here 是一个起点(传感器的 android 文档)
    [/编辑]

    【讨论】:

    • 谢谢,这确实有帮助,也许其他人可以扩展 1)内置日光检测传感器(它比相机更适合)2)您的算法建议。如果无法点击内置亮度传感器,我可能不得不使用您的方法。
    • 我必须相信该算法已经存在,但这个想法引起了我的兴趣,所以我简要地简要说明了它是如何完成的。
    • 好吧,投反对票 - 但请说明原因(特别是因为我编辑了我的回复以包括如何访问硬件传感器)
    • 我不明白为什么有人反对你。您的回答和更新都很有帮助。各位,请点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2011-12-21
    相关资源
    最近更新 更多