Utilisez la webcam pour détecter les conditions d'éclairage et régler la luminosité de l'écran

31

Existe-t-il un moyen pour que ma webcam détecte les conditions d'éclairage et ajuste la luminosité de l'écran en conséquence?

zpletan
la source

Réponses:

11

J'ai amélioré ma tentative précédente :

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

Deux problèmes avec cette approche: la luminosité de l'écran, au moins avec ma webcam, ne descend jamais en dessous de quatre, car l'appareil photo ne fonctionne pas bien dans l'obscurité, et il peut sauter un peu entre quatre et cinq. En tous cas,

Voici comment l'utiliser:

  1. sudo apt-get install python-opencv
  2. Enregistrez ce script quelque part, dites ~/test.py
  3. Exécutez-le via python test.py

Au lieu de la luminosité moyenne, j'obtiens maintenant la luminosité maximale d'une petite vignette (c'est pour éviter les problèmes de pixels morts et le rendre plus rapide). Et au moins avec ma combinaison de lumières et d'appareil photo, ça marche plutôt bien!

Essaie (:

Stefano Palazzo
la source
1
Notez qu'il s'agit d'une approche très simpliste. Il serait très facile d'obtenir un histogramme noir et blanc pondéré de l'image au lieu de la moyenne arithmétique des pixels (le rouge et le bleu n'ont pas la même luminosité). En outre, vous pouvez définir un minimum, un maximum et le faire basculer uniquement après un certain niveau de confiance que la lumière ambiante a changé. Mais je n'ai pas pris la peine à cause des problèmes que j'ai mentionnés. Il aurait les mêmes problèmes que celui-ci.
Stefano Palazzo
1
Hmm, ça marche comme vous le dites. :)
zpletan
@zpletan recommence; J'ai recommencé à zéro.
Stefano Palazzo
1
Cela semble fonctionner comme je le souhaite. Merci! (Et désolé d'avoir mis si longtemps à répondre.)
zpletan
1
Il n'y en a pas highguide stackoverflow.com/questions/30684661/… . Y-a t'il une autre possibilité?
Daniyal
2

Jetez un œil au projet RedShift, qui modifie la température de l'écran en fonction de votre emplacement géographique comme le faisait F.Lux auparavant.

http://jonls.dk/redshift/

Les instructions d'installation et d'utilisation sont bien documentées sur le site Web et, en fonction de votre matériel et de votre moniteur, vous pouvez sentir vos yeux "rafraîchis" par l'effet agréable obtenu par RedShift.

Geppettvs D'Constanzo
la source
1
Je ne pense pas que cela réponde à la question, peut-être devriez-vous supprimer votre réponse et en faire un commentaire sur la question d'origine à la place. Les réponses doivent toujours répondre directement à la question.
Stefano Palazzo
votre lien ne fonctionne pas.
TheXed
1
Il semble que cela ne tienne pas compte de votre environnement? Donc si j'étais dans une pièce sombre au milieu de la journée, ça ne ferait rien?
zpletan
@zpletan Oui, celui-ci ne change que la couleur, selon la position du soleil.
Stefano Palazzo
De ce côté le lien semble fonctionner sans problème. Stefano Palazzo, désolé si vous n'avez pas trouvé ma réponse utile. Cependant, je pense que quelqu'un d'autre pourrait trouver utile de garder la réponse. Votre choix. Vous pouvez voter pour demander la suppression. :) Je vous remercie.
Geppettvs D'Constanzo
2

Pour ajouter le PPA, appuyez sur Ctrl+ Alt+ Tsur le clavier pour ouvrir le terminal. Lorsqu'il s'ouvre, exécutez la commande ci-dessous:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Installez ensuite WildGuppy via:

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

Fonctionne sur Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 et Ubuntu 12.04.

Faire fonctionner WildGuppy au démarrage:

Exécutez la commande pour modifier le fichier de configuration.

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

Tapez votre mot de passe lorsque vous y êtes invité. Notez que le terminal n'affichera pas votre mot de passe lors de la frappe, tapez simplement à l'esprit et appuyez sur Entrée.

Lorsque le fichier s'ouvre, collez le contenu ci-dessous et enregistrez-le.

[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
la source
Hé, merci pour la réponse! C'est exactement ce que je cherchais à l'époque, mais malheureusement je n'utilise plus Ubuntu et je n'ai aucun moyen de tester (bien que je ne sache pas pourquoi cela ne fonctionnerait pas ). En tant que tel, je ne me sens pas à l'aise de supprimer le statut de réponse sur l'autre réponse, mais j'espère que d'autres trouveront cela utile et qu'il sera rapidement voté en haut si c'est le cas. À votre santé!
zpletan
@zpletan Welcom, Lorsque vous installez ce package, vous pouvez exécuter le script python situé dans /opt/wildguppy/wildguppy.py. Vous pouvez donc utiliser ce package dans n'importe quelle distribution! À votre santé!
Daniyal
@zpletan J'ai également effectué des modifications pour calculer la luminosité moyenne afin d'éviter des changements rapides et soudains de luminosité. github.com/Daniyal-Javani/autobrightness/blob/master/…
Daniyal
0

J'ai également créé un outil C pour cela, en utilisant OpenCV. Vous pouvez le trouver sur https://launchpad.net/brightness (vous devez le compiler par vous-même). J'espère que cela vous aidera.

pictuga
la source
Je l'ai compilé, mais comment l'utiliser?
zpletan
0

Cela fonctionne pour moi:

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

J'ai développé une application C qui fait cela. Voir https://github.com/goglecm/AutoBrightnessCam .

Il permet fswebcamde prendre des photos, peut être configuré avec systemdpour démarrer automatiquement et détecte si l'ordinateur portable se décharge (puis il se déclenche).

John
la source