2011-02-02 7 views
7

Mi aplicación iphone captura los datos en tiempo real de la cámara utilizando AVCaptureSession de AVFoundation. Puedo acceder a esos datos en su método de delegado en tiempo de ejecución y crear una imagen a partir de él. Puede ser CGImage, UIImage o simplemente datos brutos (CMSampleBufferRef).Determinación de la luminosidad/brillo de la imagen

Lo que estoy tratando de hacer es calcular la luminancia, el brillo de esos datos (imagen). O puede ser algún otro valor que pueda indicarme qué tan brillante es la luz de entrada.

¿Hay alguna manera estándar de obtener este valor? Tal vez usando OpenGL.

Gracias de antemano.

Respuesta

13

Simplemente convierta su imagen a YUV format y calcule el promedio del canal de luma. La conversión de colores es una operación típica y cualquier marco de procesamiento de imágenes decente lo admite. Por ejemplo, OpenCV (dijiste OpenGL, pero eso realmente no tiene nada que ver con el procesamiento de imágenes, supongo que te refieres a OpenCV) tiene CvtColor.

Si usted no tiene un marco útil, sino que tenga acceso a las intensidades de los píxeles, se puede utilizar la ecuación:

Y' = 0.299*R + 0.587*G + 0.144*B 

para obtener el canal de luminancia, y luego calcular la media. R, G y B representan los canales rojo, verde y azul respectivamente.

EDITAR

Tenga en cuenta que es posible que la cámara compensará brillantes escenas/oscuridad mediante la modificación de su apertura. Esto depende de la cámara, pero creo que la mayoría de las cámaras hacen esto; de lo contrario, sus imágenes pueden terminar saturadas (blanco puro) o negro claro, en cualquier caso, inútiles. Ojos humanos en realidad do the same thing.

Lo malo es que es difícil saber si se encuentra en un entorno oscuro o iluminado con solo mirar una imagen. En ese caso, es posible que deba ir más allá de la imagen y consultar la cámara. En teoría, puede hacer esto directamente a través de un controlador (poco probable) o tal vez mirando los metadatos de la imagen (por ejemplo, con JPEG, hay EXIF).

Por último, no ha dicho qué es exactamente lo que quiere saber el brillo de. Si es la escena general, entonces el promedio será lo suficientemente bueno. Si se trata de una parte de la escena, es posible que tengas que hacer algo un poco más inteligente. Háganos saber si ese es el caso.

+0

Gracias, supongo que eso tiene que funcionar. Lo probaré y publicaré el resultado aquí. – krafter

+0

Echa un vistazo a mi comentario editado: he identificado un problema potencial y algunas formas en que puedes resolverlo. – misha

+0

Sí, esto realmente funciona: obteniendo información de píxeles dividiéndola en intensidades de color y calculando Y como se muestra aquí. Como necesito el valor de brillo promedio de las pulsaciones de luz pequeñas (rápidas) antes de que la cámara pueda ajustarlo, este método funciona bien. Gracias de nuevo. – krafter

Cuestiones relacionadas