2011-01-19 9 views
8

Lo siguiente se aplica al sistema operativo Android.Android: ¿detecta el brillo (cantidad de luz) en el entorno del teléfono usando la cámara?

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

La idea es que la cámara puede 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 de antemano.

+0

la mayoría (todos?) los teléfonos Android tienen dos sensores de hardware pequeñas que se utilizan para la "detección de la luz del día." La respuesta de estos sensores es cómo su teléfono controla el brillo de la pantalla cuando establece la configuración en control automático. Me pregunto si podrías acceder a esa información. Sería muchas veces más confiable. – user432209

+0

Gracias user432209, eso definitivamente ayudaría. Espero que este sensor (¿cómo se llama?) Esté a disposición del público, tal vez alguien nos pueda aclarar sobre este tema. – Tom

Respuesta

17

Aquí es cómo se registra 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); 
} 

EDIT: Gracias a @AntiMatter para las actualizaciones sugeridas.

Docs: SensorEventListener SensorManager SensorEvent Sensor

+0

Genial, este sensor me ayudará mucho. No estoy seguro de cómo muchos dispositivos (especialmente los reproductores de medios de archos menos costosos) tienen este sensor implementado, pero esto lo hará por ahora. Gracias. – Tom

+0

Se podría usar '' en el manifiesto, y los dispositivos que no cuentan con este sensor no se encontrarían en el mercado. Alternativamente, parece que podría llamar a 'getSensorList (Sensor.TYPE_LIGHT);' y luego verificar si el tamaño de la lista es mayor que 0 para ver si el dispositivo tiene el sensor requerido programáticamente o no. – kcoppock

+0

Entiendo kcoppock, estaba pensando en una alternativa para admitir dispositivos que carecen de ella. Sin embargo, esto es algo que necesito preguntarme en el futuro, ya que no estoy seguro de si es necesario. Gracias de nuevo. – Tom

1

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

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

Por supuesto, primero tendrá que tomar una fotografía. 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 brillantes, cuáles son oscuros y cuáles están en el 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]
Here es un punto de partida (la documentación androide para sensores)
[/ editar]

+0

Gracias, esto ayuda, tal vez alguien más será capaz de expandir el 1) el sensor de detección de la luz del día inbuild (que sería adecuado para mejor que la cámara) 2) su sugerencia algoritmo. Si no se puede tocar el sensor de brillo interno, probablemente tenga que usar su enfoque. – Tom

+0

Tengo que creer que el algoritmo ya existe, pero la idea me intrigó, así que le di un esbozo rápido de cómo se podría hacer. – KevinDTimm

+0

ver mi edición - parece que el sensor está accesible. – KevinDTimm

1

utilizar la cámara no tiene sentido, ya que la cámara ajustará el tiempo de exposición y la abertura para 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 el 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.

+0

Gracias por la información acerca de la cámara, que se preguntan si este hecho significa que un dispositivo sin necesidad de un sensor de luz no puede estimar el brillo de la habitación con la cámara (como un método de respaldo). – Tom

0

El gran problema en querer clavar el brillo de abajo es de encontrar la manera de HTC está haciendo en su camera.apk. Debido a que la aplicación Android Camera original es horrible para la sobreexposición, especialmente para la DINC.

5

Si desea utilizar la cámara, por ejemplo, si los otros sensores no estaban disponibles entonces yo

  1. Ajuste de exposición automática de la cámara en off, y ajustar la compensación de la exposición a la captura 0
  2. Conjunto de 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 (quizás incluso podría establecerla en invisible y obtener un marco para analizar, no estoy seguro)
  4. Obtenga una previsualización de imagen pero esos están en formato YUV, por lo que 2.1 y woul anterior Necesito un traductor.

continuación, me gustaría calcular el histograma de la luminosidad imágenes y el trabajo a la derecha (brillante) a la izquierda (más tenue) hasta encontrar el primer valor significativamente mayor que N, lo que determinaría el brillo de la escena.

Una vez dicho todo que no iba a hacerlo ya que se necesitaría para probar una gran cantidad de situaciones atípicas.

de golf no está seguro de lo que se utiliza caso es, si se trata de una situación en la que lo está utilizando para ajustar "brillo" en un coche, a continuación, la cámara mirando hacia adelante se llevaría a cabo por los faros etc.

problema de todos modos interesantes, pero parece como un montón de trabajo para tan poca ganancia, especialmente con la mayoría de las piezas dignas de hardware de tener esos sensores

+0

Respecto al punto 3, en mi experiencia, hacer que la ventana de previsualización de la cámara sea invisible no funciona a menos que use 'TextureView' y establezca' WindowManager.LayoutParams.alpha' en '0'. – Sam

+0

En cuanto al punto 4, si usa 'TextureView' como vista previa de la cámara, puede simplemente llamar a' TextureView.getBitmap' para obtener el fotograma actual en RGB. – Sam

+0

Por supuesto, necesitas API 14 (Android 4.0, creo) para usar 'TextureView'. – Sam

Cuestiones relacionadas