Android: ¿detecta el brillo (cantidad de luz) en el entorno del teléfono usando la cámara?

Lo siguiente aplica al sistema operativo Android.

Estoy tratando de estimar qué tan oscuro (o liviano) está en la habitación donde se encuentra el teléfono usando la cámara.

La idea es que la cámara pueda devolver un cierto nivel de brillo, que puedo usar para determinar la cantidad de luz en el entorno del teléfono.

Mi pregunta es simple: ¿cómo uso la cámara (ya sea la parte delantera de la cámara trasera) para obtener esta cantidad de brillo (la “cantidad de luz”)?

Gracias por adelantado.

Aquí se muestra cómo registrar un oyente en el sensor de luz:

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); } 

EDITAR: Gracias a @AntiMatter por las actualizaciones sugeridas.

Documentos: SensorEventListener SensorManager SensorEvent Sensor

Si quisiera usar la cámara, por ejemplo, si los otros sensores no estuvieran disponibles, lo haría

  1. Desactive la exposición automática de la cámara y establezca la compensación de exposición en 0
  2. Establezca la captura en la calidad / tamaño más bajo (¿por qué molestarse con más?)
  3. Haga que la ventana de vista previa sea lo más pequeña posible (tal vez incluso podría establecerla en invisible y obtener un marco para analizar, no estoy seguro)
  4. Obtenga un marco de vista previa de la imagen, pero esos están en formato yuv, por lo que 2.1 y versiones anteriores necesitarían un traductor.

Luego calculo el histogtwig para la luminosidad de las imágenes y trabajo a la derecha (más shiny) a la izquierda (más oscuro) hasta que encuentre el primer valor significativo más alto que N, que determinaría el brillo de la escena.

Habiendo dicho todo eso, no lo haría, ya que necesitaría probar muchas situaciones atípicas.

Por supuesto, no estoy seguro de cuál es el caso de uso, si es una situación en la que lo está usando para ajustar el “brillo” en un automóvil, entonces la cámara que mira hacia adelante se vería afectada por los faros, etc.

De todos modos, es un problema interesante, pero parece que hay mucho trabajo para tan poca ganancia, especialmente con la mayoría de las piezas de hardware decentes que tienen esos sensores

Mi respuesta puede ser demasiado incompleta como respuesta, pero me gusta el formato aquí.

Además, mi respuesta no es graciosa, así que no dejes de leer de inmediato.

Por supuesto, primero tendrás que tomar una foto. Entonces tendrás que definir ‘brillo’. No tengo el algoritmo para hacerlo, pero supongo que ya se hizo algo así. Tal vez algo así como:

Determine qué valores de píxeles son shinys, cuáles son oscuros y cuáles están en medio (y cada uno de ellos puede tener una cantidad variable de brillo). Luego tendrá que aplicar ese algoritmo a su fotografía para obtener un valor de brillo.

Sí, esta es una vista muy corta (35,000 pies) del problema, pero debería darle algunas ideas sobre dónde comenzar.

[editar]
Aquí hay un lugar para comenzar (la documentación de Android para los sensores)
[/editar]

Usar la cámara no tiene sentido, ya que la cámara ajustará el tiempo de exposición y la apertura a la luz circundante, de modo que las imágenes grabadas tendrán un brillo general muy similar independientemente de la luz real disponible (al menos en un mundo ideal).

La API de Android ofrece funcionalidad en SensorManager para acceder a los sensores de hardware (está interesado en el sensor de tipo TYPE_LIGHT). No estoy seguro, sin embargo, si puede confiar en el acceso a estos sensores a través de la API, aunque pueden (o no) estar presentes.

El gran problema de querer descifrar el brillo es descubrir cómo HTC lo está haciendo en su cámara. Debido a que la aplicación Android Camera original es horrible para la sobreexposición, especialmente para la DINC.