Użyj kamery internetowej, aby wyczuć warunki oświetlenia i dostosować jasność ekranu

31

Czy istnieje sposób, aby kamera internetowa wyczuła warunki oświetlenia i odpowiednio dostosowała jasność ekranu?

zpletan
źródło

Odpowiedzi:

11

Ulepszyłem poprzednią próbę :

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

Dwa problemy z tym podejściem: Jasność wyświetlacza, przynajmniej w mojej kamerze internetowej, nigdy nie spada poniżej czterech, ponieważ aparat nie działa dobrze w ciemności i może przeskoczyć nieco między czwartą a piątą. Tak czy inaczej,

Oto jak z niego korzystać:

  1. sudo apt-get install python-opencv
  2. Zapisz ten skrypt gdzieś, powiedzmy ~/test.py
  3. Uruchom przez python test.py

Zamiast średniej jasności, uzyskuję teraz maksymalną jasność małego pionka (pozwala to uniknąć problemów z martwymi pikselami i przyspieszyć). A przynajmniej z moją kombinacją świateł i aparatu działa całkiem dobrze!

Spróbuj (:

Stefano Palazzo
źródło
1
Zauważ, że jest to bardzo uproszczone podejście. Bardzo łatwo byłoby uzyskać ważony czarno-biały histogram obrazu zamiast średniej arytmetycznej pikseli (czerwony i niebieski nie mają tej samej jasności). Możesz także ustawić minimum, maksimum i przełączać je dopiero po pewnym poziomie pewności, że zmieniło się oświetlenie otoczenia. Ale nie zawracałem sobie głowy sprawami, o których wspomniałem. Miałby takie same problemy jak ten.
Stefano Palazzo
1
Hmm, dobrze działa jak mówisz. :)
zpletan
@zpletan dać mu jeszcze jedną szansę; Zacząłem od zera.
Stefano Palazzo
1
To wydaje się działać tak, jak chcę. Dziękuję Ci! (I przepraszam, że tak długo trwa odpowiedź.)
zpletan
1
Nie ma highguiz stackoverflow.com/questions/30684661/... . Czy jest jakiś inny sposób?
Daniyal
2

Spójrz na projekt RedShift, który zmienia temperaturę ekranu w zależności od położenia geograficznego, tak jak wcześniej robił F.Lux.

http://jonls.dk/redshift/

Instrukcje dotyczące instalacji i użytkowania są dobrze udokumentowane na stronie internetowej i, w zależności od sprzętu i monitora, możesz poczuć się jak „odświeżony” dzięki przyjemnemu efektowi, który osiąga RedShift.

Geppettvs D'Constanzo
źródło
1
Nie sądzę, że to odpowiada na pytanie, być może powinieneś usunąć swoją odpowiedź i zamienić ją w komentarz do oryginalnego pytania. Odpowiedzi powinny zawsze bezpośrednio odpowiadać na pytanie.
Stefano Palazzo
twój link nie działa.
TheXed 28.01.11
1
Wygląda na to, że to nie uwzględnia twojego otoczenia? Więc gdybym był w ciemnym pokoju w środku dnia, nic by to nie zrobiło?
zpletan
@zpletan Tak, ten zmienia tylko kolor, zgodnie z pozycją słońca.
Stefano Palazzo
Ta strona wydaje się działać bez problemów. Stefano Palazzo, przepraszam, jeśli nie znalazłeś mojej odpowiedzi przydatnej. Myślę jednak, że ktoś inny może uznać ją za przydatną, jeśli zachowasz odpowiedź. Twój wybór. Możesz głosować, aby poprosić o usunięcie. :) Dziękuję Ci.
Geppettvs D'Constanzo
2

Aby dodać PPA, naciśnij Ctrl+ Alt+ Tna klawiaturze, aby otworzyć terminal. Po otwarciu uruchom poniższe polecenie:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Następnie zainstaluj WildGuppy przez:

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

Działa na Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 i Ubuntu 12.04.

Uruchom WildGuppy podczas uruchamiania:

Uruchom polecenie, aby edytować plik konfiguracyjny.

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

Po wyświetleniu monitu wpisz hasło. Zauważ, że terminal nie wyświetli twojego hasła podczas pisania, po prostu wpisz w pamięci i naciśnij Enter.

Po otwarciu pliku wklej poniżej treści i zapisz go.

[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
źródło
Hej, dzięki za odpowiedź! Właśnie tego szukałem w ciągu dnia, ale niestety nie używam już Ubuntu i nie mam możliwości przetestowania (choć nie wiem, dlaczego to nie zadziała). W związku z tym nie czuję się komfortowo usuwając status odpowiedzi na drugą odpowiedź, ale mam nadzieję, że inni uznają to za przydatne i jeśli tak, zostanie szybko przegłosowane na szczyt. Twoje zdrowie!
zpletan
@zpletan Welcom, Po zainstalowaniu tego pakietu można uruchomić skrypt Pythona znajdujący się w /opt/wildguppy/wildguppy.py. Możesz więc użyć tego pakietu w dowolnej dystrybucji! Twoje zdrowie!
Daniyal
@zpletan Wprowadzam również pewne zmiany, aby obliczyć średnią jasność, aby zapobiec szybkim i nagłym zmianom jasności. github.com/Daniyal-Javani/autobrightness/blob/master/…
Daniyal
0

Zrobiłem też do tego narzędzie C, używając OpenCV. Możesz go znaleźć na https://launchpad.net/brightness (musisz go skompilować samodzielnie). Mam nadzieję, że ci to pomoże.

pictuga
źródło
Mam go skompilowany, ale jak go używać?
zpletan
0

To działa dla mnie:

#!/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
źródło
0

Opracowałem aplikację C, która to robi. Zobacz https://github.com/goglecm/AutoBrightnessCam .

Służy fswebcamdo robienia zdjęć, można go skonfigurować tak, systemdaby uruchamiał się automatycznie i wykrywa, czy laptop się rozładowuje (następnie uruchamia się).

Jan
źródło