Use la cámara web para detectar las condiciones de iluminación y ajustar el brillo de la pantalla

31

¿Hay alguna manera de que mi cámara web detecte las condiciones de iluminación y ajuste el brillo de la pantalla en consecuencia?

zpletan
fuente

Respuestas:

11

He mejorado en mi intento anterior :

import opencv
import opencv.highgui
import time
import commands


def get_image():
    image = opencv.highgui.cvQueryFrame(camera)
    return opencv.adaptors.Ipl2PIL(image)

camera = opencv.highgui.cvCreateCameraCapture(-1)

while 1:
    image = get_image()
    image.thumbnail((32, 24, ))
    image = tuple(ord(i) for i in image.tostring())
    x = int((int((max(image) / 256.0) * 10) + 1) ** 0.5 / 3 * 10)
    cmd = ("sudo su -c 'echo " + str(x) +
        " > /sys/devices/virtual/backlight/acpi_video0/brightness'")
    status, output = commands.getstatusoutput(cmd)
    assert status is 0

Dos problemas con este enfoque: el brillo de la pantalla, al menos con mi cámara web, nunca es inferior a cuatro, porque la cámara no funciona bien en la oscuridad y puede saltar un poco entre cuatro y cinco. De todas formas,

Así es como se usa:

  1. sudo apt-get install python-opencv
  2. Guarde este script en alguna parte, diga ~/test.py
  3. Ejecútalo a través de python test.py

En lugar del brillo promedio, ahora obtengo el brillo máximo de una pequeña miniatura (esto es para evitar problemas de píxeles muertos y hacerlo más rápido). Y al menos con mi combinación de luces y cámara, ¡funciona bastante bien!

Darle una oportunidad (:

Stefano Palazzo
fuente
1
Tenga en cuenta que este es un enfoque muy simplista. Sería muy fácil obtener un histograma ponderado en blanco y negro de la imagen en lugar de la media aritmética de los píxeles (rojo y azul no tienen el mismo brillo). Además, puede establecer un mínimo, un máximo y hacer que cambie solo después de un cierto nivel de confianza de que la luz ambiental ha cambiado. Pero no me molesté por los problemas que mencioné. Tendría los mismos problemas que este.
Stefano Palazzo
1
Hmm, bueno, funciona como dices. :)
zpletan
@zpletan dale otra oportunidad; He empezado desde cero.
Stefano Palazzo
1
Esto parece funcionar de la manera que quiero. ¡Gracias! (Y perdón por tardar tanto en responder.)
zpletan
1
No hay highguide stackoverflow.com/questions/30684661/… . ¿Hay alguna otra manera?
Daniyal
2

Eche un vistazo al proyecto RedShift, que cambia la temperatura de la pantalla en función de su ubicación geográfica como lo hacía anteriormente F.Lux.

http://jonls.dk/redshift/

Las instrucciones sobre la instalación y el uso están bien documentadas en el sitio web y, dependiendo de su hardware y monitor, puede sentir sus ojos "refrescados" por el efecto agradable que logra RedShift.

Geppettvs D'Constanzo
fuente
1
No creo que esto responda la pregunta, tal vez deberías eliminar tu respuesta y hacer un comentario sobre la pregunta original. Las respuestas siempre deben responder directamente a la pregunta.
Stefano Palazzo
Su enlace no funciona.
TheXed
1
¿Parece que esto no tiene en cuenta tu entorno? Entonces, si estuviera en una habitación oscura en el medio del día, ¿no haría nada?
zpletan
@zpletan Sí, este solo cambia el color, de acuerdo con la posición del sol.
Stefano Palazzo
De este lado, el enlace parece funcionar sin problemas. Stefano Palazzo, perdón si no encontraste útil mi respuesta. Sin embargo, creo que alguien más podría encontrarlo útil si mantiene la respuesta. Tu elección. Puede votar para solicitar la eliminación. :) Gracias.
Geppettvs D'Constanzo
2

Para agregar el PPA, presione Ctrl+ Alt+ Ten el teclado para abrir el terminal. Cuando se abra, ejecute el siguiente comando:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Luego instale WildGuppy a través de:

sudo apt-get update; sudo apt-get install wildguppy

Funciona en Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 y Ubuntu 12.04.

Haga que WildGuppy se ejecute al inicio:

Ejecute el comando para editar el archivo de configuración.

sudo gedit ~/.config/autostart/wildguppy-gtk.desktop

Escriba su contraseña cuando se le solicite. Tenga en cuenta que el terminal no mostrará su contraseña al escribir, solo escriba y presione enter.

Cuando se abra el archivo, pegue el contenido debajo y guárdelo.

[Desktop Entry]
Type=Application
Exec=wildguppy-gtk
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=WildGuppy
Name=WildGuppy
Comment[en_US]=
Comment=
Daniyal
fuente
Hola, gracias por la respuesta! Esto es exactamente lo que estaba buscando en el pasado, pero desafortunadamente ya no uso Ubuntu y no tengo forma de probarlo (aunque no sé por qué no funcionaría). Como tal, no me siento cómodo eliminando el estado de la respuesta en la otra respuesta, pero espero que otros encuentren esto útil y se votará rápidamente a la cima si es así. ¡Aclamaciones!
zpletan
@zpletan Welcom, cuando instala este paquete, puede ejecutar el script python ubicado en /opt/wildguppy/wildguppy.py. ¡Entonces puedes usar este paquete en cualquier distribución! ¡Aclamaciones!
Daniyal
@zpletan También realizo algunos cambios para calcular el brillo promedio para evitar cambios rápidos y repentinos en el brillo. github.com/Daniyal-Javani/autobrightness/blob/master/…
Daniyal
0

También hice una herramienta C para eso, usando OpenCV. Puede encontrarlo en https://launchpad.net/brightness (debe compilarlo usted mismo). Espero que te ayude.

pictuga
fuente
Lo tengo compilado, pero ¿cómo lo uso?
zpletan 01 de
0

Esto funciona para mi:

#!/usr/bin/env python3

import subprocess, time


# webcam brightness if webcam doesn’t get any light
blackpoint = 0.05

# webcam brightness if webcam is fully exposed (e.g. sun at noon)
whitepoint = 0.92549

# Path to program that sets screen brightness.  Takes float between 0 and 1 as
# a parameter.  Should be whitelisted for sudo if this script is not run as
# root.  Sample script:
#
# #!/bin/sh
# echo "($1 * 4882) / 1" | bc > /sys/class/backlight/intel_backlight/brightness
brightness_setter = "/home/bronger/bin/set_brightness.sh"

# it doen’t get any darker
minimal_brightness = 0.1

# in seconds
sleeping_time = 20


def get_brightness():
    """Returns webcam brightness as a float between 0 and 1 (boundaries
    included)."""
    fswebcam = subprocess.Popen(["fswebcam", "-q", "--no-banner", "--png", "0", "-"], stdout=subprocess.PIPE)
    convert = subprocess.run(["convert", "png:-", "-colorspace", "gray", "-scale", "10%x10%",
                              "-format", "%[fx:image.maxima]", "info:"],
                             check=True, stdin=fswebcam.stdout, capture_output=True, text=True)
    assert fswebcam.wait() == 0
    brightness = float(convert.stdout)
    brightness = (brightness - blackpoint) / (whitepoint - blackpoint)
    brightness = max(0.0, min(1.0, brightness))
    return brightness


old_brightness = None
while True:
    brightness = get_brightness() ** 2
    brightness = max(minimal_brightness, brightness)
    if old_brightness is None or abs(brightness - old_brightness) > 0.2:
        subprocess.run(["sudo", brightness_setter, str(brightness)], check=True)
        old_brightness = brightness
    time.sleep(sleeping_time)
Torsten Bronger
fuente
0

He desarrollado una aplicación C que hace esto. Ver https://github.com/goglecm/AutoBrightnessCam .

Se utiliza fswebcampara tomar fotos, se puede configurar systemdpara que se inicie automáticamente y detecta si la computadora portátil se está descargando (luego se activa).

John
fuente