Usa la webcam per rilevare le condizioni di illuminazione e regolare la luminosità dello schermo


31

Esiste un modo per fare in modo che la mia webcam rilevi le condizioni di illuminazione e regoli la luminosità dello schermo di conseguenza?

Risposte:


11

Ho migliorato il mio tentativo precedente :

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

Due problemi con questo approccio: la luminosità del display, almeno con la mia webcam, non scende mai più di quattro, perché la fotocamera non funziona bene al buio e potrebbe saltare un po 'tra le quattro e le cinque. Comunque,

Ecco come usarlo:

  1. sudo apt-get install python-opencv
  2. Salva questo script da qualche parte, diciamo ~/test.py
  3. Eseguilo via python test.py

Invece della luminosità media, ora sto ottenendo la massima luminosità di un piccolo bicchiere (questo è per evitare problemi di pixel morti e renderlo più veloce). E almeno con la mia combinazione di luci e fotocamera, funziona piuttosto bene!

Provaci (:


1
Si noti che questo è un approccio molto semplicistico. Sarebbe molto facile ottenere un istogramma in bianco e nero ponderato dell'immagine anziché la media aritmetica dei pixel (rosso e blu non hanno la stessa luminosità). Inoltre, è possibile impostare un minimo, un massimo e farlo cambiare solo dopo un certo livello di sicurezza che la luce ambientale è cambiata. Ma non mi sono preoccupato per i problemi che ho citato. Avrebbe gli stessi problemi di questo.
Stefano Palazzo

1
Bene, funziona come dici tu. :)
zpletan,

@zpletan provaci ancora; Ho iniziato da zero.
Stefano Palazzo

1
Questo sembra funzionare nel modo in cui voglio. Grazie! (E mi dispiace per aver
impiegato

1
Non è disponibile highguida stackoverflow.com/questions/30684661/… . C'è un altro modo?
Daniyal,

2

Dai un'occhiata al progetto RedShift, che modifica la temperatura dello schermo in base alla tua posizione geografica, come in precedenza F.Lux.

http://jonls.dk/redshift/

Le istruzioni per l'installazione e l'uso sono ben documentate nel sito Web e, a seconda dell'hardware e del monitor, puoi sentire i tuoi occhi come "rinfrescati" dal piacevole effetto ottenuto da RedShift.


1
Non credo che questo risponda alla domanda, forse dovresti eliminare la tua risposta e fare un commento sulla domanda originale. Le risposte dovrebbero sempre rispondere direttamente alla domanda.
Stefano Palazzo

il tuo link non funziona.
TheXed,

1
Sembra che questo non tenga conto dell'ambiente circostante? Quindi se fossi in una stanza buia a metà giornata, non farebbe nulla?
zpletan,

@zpletan Sì, questo cambia solo il colore, in base alla posizione del sole.
Stefano Palazzo

Da questo lato il collegamento sembra funzionare senza problemi. Stefano Palazzo, scusa se non hai trovato utile la mia risposta. Tuttavia, penso che qualcun altro potrebbe trovarlo utile se mantieni la risposta. La tua scelta. Puoi votare per richiedere la cancellazione. :) Grazie.
Geppettvs D'Constanzo,

2

Per aggiungere il PPA, premere Ctrl+ Alt+ Tsulla tastiera per aprire il terminale. Quando si apre, esegui il comando seguente:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Quindi installare WildGuppy tramite:

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

Funziona su Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 e Ubuntu 12.04.

Fai funzionare WildGuppy all'avvio:

Esegui il comando per modificare il file di configurazione.

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

Digita la password quando richiesto. Si noti che il terminale non visualizzerà la password durante la digitazione, basta digitare e premere invio.

Quando il file si apre, incolla il contenuto sottostante e salvalo.

[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=

Ehi, grazie per la risposta! Questo è esattamente quello che stavo cercando in passato, ma sfortunatamente non uso più Ubuntu e non ho modo di testarlo (anche se non so perché non funzionerebbe). In quanto tale, non mi sento a mio agio nel rimuovere lo stato della risposta nell'altra risposta, ma spero che altri lo trovino utile e che verrà rapidamente votato in alto in tal caso. Saluti!
zpletan,

@zpletan Welcom, quando installi questo pacchetto, puoi eseguire lo script python che si trova in /opt/wildguppy/wildguppy.py. Quindi puoi usare questo pacchetto in qualsiasi distribuzione! Saluti!
Daniyal,

@zpletan Ho anche apportato alcune modifiche per calcolare la luminosità media per evitare cambi di luminosità rapidi e improvvisi. github.com/Daniyal-Javani/autobrightness/blob/master/…
Daniyal



0

Questo funziona per me:

#!/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)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.