Verwenden Sie die Webcam, um die Lichtverhältnisse zu erfassen und die Bildschirmhelligkeit anzupassen


31

Gibt es eine Möglichkeit, dass meine Webcam die Lichtverhältnisse erkennt und die Bildschirmhelligkeit entsprechend anpasst?

Antworten:


11

Ich habe mich gegenüber meinem vorherigen Versuch verbessert :

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

Zwei Probleme bei diesem Ansatz: Die Anzeigehelligkeit geht, zumindest bei meiner Webcam, nie unter vier, da die Kamera bei Dunkelheit nicht gut funktioniert und möglicherweise zwischen vier und fünf ein wenig überspringt. Sowieso,

So verwenden Sie es:

  1. sudo apt-get install python-opencv
  2. Speichern Sie dieses Skript beispielsweise irgendwo ~/test.py
  3. Führen Sie es über python test.py

Anstelle der durchschnittlichen Helligkeit erhalte ich jetzt die maximale Helligkeit eines kleinen Miniaturbilds (um Probleme mit toten Pixeln zu vermeiden und schneller zu machen). Und zumindest mit meiner Kombination aus Licht und Kamera funktioniert es ziemlich gut!

Versuche es (:


1
Beachten Sie, dass dies ein sehr simpler Ansatz ist. Es wäre sehr einfach, ein gewichtetes Schwarz-Weiß-Histogramm des Bildes anstelle des arithmetischen Mittels der Pixel zu erhalten (Rot und Blau haben nicht die gleiche Helligkeit). Sie können auch ein Minimum und ein Maximum festlegen und erst nach einem gewissen Maß an Sicherheit, dass sich das Umgebungslicht geändert hat, umschalten lassen. Aber ich habe mich wegen der erwähnten Probleme nicht darum gekümmert. Es hätte die gleichen Probleme wie dieses.
Stefano Palazzo

1
Hmm, es funktioniert wie du sagst. :)
zpletan

@zpletan versuchen Sie es noch einmal; Ich habe von vorne angefangen.
Stefano Palazzo

1
Dies scheint so zu funktionieren, wie ich es will. Vielen Dank! (Und entschuldigen Sie, dass Sie so lange
brauchen

1
Es gibt keine highguivon stackoverflow.com/questions/30684661/… . Gibt es einen anderen Weg?
Daniyal

2

Schauen Sie sich das RedShift-Projekt an, bei dem die Bildschirmtemperatur auf der Grundlage Ihres geografischen Standorts geändert wird, wie dies früher bei F.Lux der Fall war.

http://jonls.dk/redshift/

Anweisungen zur Installation und Verwendung sind auf der Website gut dokumentiert. Je nach Hardware und Monitor fühlen Sie sich durch den schönen Effekt, den RedShift erzielt, wie "erfrischt".


1
Ich glaube nicht, dass dies die Frage beantwortet. Vielleicht sollten Sie Ihre Antwort löschen und stattdessen einen Kommentar zur ursprünglichen Frage abgeben. Antworten sollten die Frage immer direkt beantworten.
Stefano Palazzo

Ihr Link funktioniert nicht.
TheXed

1
Es hört sich so an, als würde dies Ihre Umgebung nicht berücksichtigen? Wenn ich also mitten am Tag in einem dunklen Raum wäre, würde es nichts tun?
Zpletan

@zpletan Ja, dieser ändert nur die Farbe, je nach Sonnenstand.
Stefano Palazzo

Auf dieser Seite scheint der Link ohne Probleme zu funktionieren. Stefano Palazzo, entschuldigen Sie, wenn Sie meine Antwort nicht nützlich fanden. Ich denke jedoch, dass jemand anderes es nützlich finden könnte, wenn Sie die Antwort behalten. Deine Entscheidung. Sie können abstimmen, um die Löschung zu beantragen. :) Vielen Dank.
Geppettvs D'Constanzo

2

Um den PPA hinzuzufügen, drücken Sie auf der Tastatur Ctrl+ Alt+ T, um das Terminal zu öffnen. Führen Sie beim Öffnen den folgenden Befehl aus:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Dann installiere WildGuppy über:

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

Funktioniert unter Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 und Ubuntu 12.04.

Stellen Sie sicher, dass WildGuppy beim Start ausgeführt wird:

Führen Sie den Befehl aus, um die Konfigurationsdatei zu bearbeiten.

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

Geben Sie Ihr Passwort ein, wenn Sie dazu aufgefordert werden. Beachten Sie, dass das Terminal Ihr Passwort bei der Eingabe nicht anzeigt. Geben Sie es einfach ein und drücken Sie die Eingabetaste.

Wenn die Datei geöffnet wird, fügen Sie den folgenden Inhalt ein und speichern Sie ihn.

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

Hey, danke für die Antwort! Genau das habe ich damals gesucht, aber leider benutze ich Ubuntu nicht mehr und kann es nicht testen (obwohl ich nicht weiß, warum es nicht funktionieren würde). Aus diesem Grund ist es mir unangenehm, den Antwortstatus für die andere Antwort zu entfernen. Ich hoffe jedoch, dass dies für andere hilfreich ist und in diesem Fall schnell nach oben gestimmt wird. Prost!
Zpletan

@zpletan Welcom, Wenn Sie dieses Paket installieren, können Sie ein Python-Skript ausführen, das sich in befindet /opt/wildguppy/wildguppy.py. Sie können dieses Paket also in jeder Distribution verwenden! Prost!
Daniyal

@zpletan Ich nehme auch einige Änderungen vor, um die durchschnittliche Helligkeit zu berechnen und schnelle und plötzliche Helligkeitsänderungen zu vermeiden. github.com/Daniyal-Javani/autobrightness/blob/master/…
Daniyal



0

Das funktioniert bei mir:

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

0

Ich habe eine C-App entwickelt, die dies tut. Siehe https://github.com/goglecm/AutoBrightnessCam .

Es fswebcamnimmt Bilder auf, kann so konfiguriert werden systemd, dass es automatisch startet und erkennt, ob sich der Laptop entlädt (und schaltet sich dann ein).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.