Use a webcam para detectar as condições de iluminação e ajustar o brilho da tela

31

Existe uma maneira de a minha webcam sentir as condições de iluminação e ajustar o brilho da tela de acordo?

zpletan
fonte

Respostas:

11

Eu melhorei na minha tentativa 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

Dois problemas com essa abordagem: O brilho da tela, pelo menos com a minha webcam, nunca fica menor que quatro, porque a câmera não funciona bem no escuro e pode pular um pouco entre quatro e cinco. De qualquer forma,

Isto é como usá-lo:

  1. sudo apt-get install python-opencv
  2. Salve esse script em algum lugar, digamos ~/test.py
  3. Execute-o via python test.py

Em vez do brilho médio, agora estou recebendo o brilho máximo de uma miniatura pequena (para evitar problemas com pixels mortos e torná-lo mais rápido). E pelo menos com a minha combinação de luzes e câmera, funciona muito bem!

De uma chance (:

Stefano Palazzo
fonte
11
Observe que esta é uma abordagem muito simplista. Seria muito fácil obter um histograma preto e branco da imagem em vez da média aritmética dos pixels (vermelho e azul não têm o mesmo brilho). Além disso, você pode definir um mínimo, um máximo e alterná-lo somente após um certo nível de confiança de que a luz ambiente mudou. Mas não me incomodei por causa dos problemas que mencionei. Teria os mesmos problemas que este.
Stefano Palazzo
11
Hmm, bem, funciona como você diz. :)
zpletan
@zpletan tente novamente; Eu comecei do zero.
Stefano Palazzo
11
Isso parece funcionar da maneira que eu quero. Obrigado! (E desculpe por ter demorado tanto para responder.)
zpletan
11
Não há highguino stackoverflow.com/questions/30684661/… . Existe alguma outra maneira?
Daniyal
2

Dê uma olhada no projeto RedShift, que altera a temperatura da tela com base na sua localização geográfica, como o F.Lux fazia anteriormente.

http://jonls.dk/redshift/

As instruções de instalação e uso estão bem documentadas no site e, dependendo do seu hardware e monitor, você pode sentir seus olhos "refrescados" pelo bom efeito alcançado pelo RedShift.

Geppettvs D'Constanzo
fonte
11
Não acho que isso responda à pergunta; talvez você deva excluir sua resposta e fazer um comentário na pergunta original. As respostas devem sempre responder diretamente à pergunta.
Stefano Palazzo
seu link não funciona.
TheXed 28/01
11
Parece que isso não leva em consideração o seu entorno? Então, se eu estivesse em um quarto escuro no meio do dia, não faria nada?
zpletan
@zpletan Sim, este muda apenas a cor, de acordo com a posição do sol.
Stefano Palazzo
Deste lado, o link parece funcionar sem problemas. Stefano Palazzo, desculpe se você não achou minha resposta útil. No entanto, acho que alguém poderia achar útil se você mantiver a resposta. Sua escolha. Você pode votar para solicitar a exclusão. :) Obrigado.
Geppettvs D'Constanzo
2

Para adicionar o PPA, pressione Ctrl+ Alt+ Tno teclado para abrir o terminal. Quando abrir, execute o comando abaixo:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Em seguida, instale o WildGuppy via:

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

Funciona no Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 e Ubuntu 12.04.

Faça o WildGuppy em execução na inicialização:

Execute o comando para editar o arquivo de configuração.

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

Digite sua senha quando solicitado. Observe que o terminal não exibirá sua senha ao digitar, basta digitar em mente e pressionar Enter.

Quando o arquivo abrir, cole o conteúdo abaixo e salve-o.

[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
fonte
Ei, obrigado pela resposta! Era exatamente isso que eu estava procurando naquele dia, mas infelizmente não uso mais o Ubuntu e não tenho como testar (embora eu não saiba por que não funcionaria). Como tal, não me sinto à vontade para remover o status da resposta na outra resposta, mas espero que outros achem isso útil e que seja rapidamente votado no topo, se for o caso. Felicidades!
Zpletan
@zpletan Welcom, Ao instalar este pacote, você pode executar o script python localizado em /opt/wildguppy/wildguppy.py. Então você pode usar este pacote em qualquer distro! Felicidades!
Daniyal
@zpletan Também faço algumas alterações para calcular o brilho médio para evitar alterações rápidas e repentinas no brilho. github.com/Daniyal-Javani/autobrightness/blob/master/…
Daniyal
0

Eu também fiz uma ferramenta C para isso, usando o OpenCV. Você pode encontrá-lo em https://launchpad.net/brightness (você deve compilá-lo por conta própria). Espero que ajude você.

pictuga
fonte
Eu o compilei, mas como eu o uso?
Zpletan
0

Isso funciona para mim:

#!/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
fonte
0

Eu desenvolvi um aplicativo C que faz isso. Consulte https://github.com/goglecm/AutoBrightnessCam .

Ele usa fswebcampara tirar fotos, pode ser configurado systemdpara iniciar automaticamente e detecta se o laptop está descarregando (em seguida, entra em ação).

John
fonte