Is there a way to have my webcam sense lighting conditions and adjust screen brightness accordingly?
I've improved on my previous attempt (python):
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
Two problems with this approach: The display brightness, at least with my webcam, never goes lower than four, because the camera doesn't work well in darkness, and it might skip a bit between four and five. Anyway,
This is how to use it:
sudo apt-get install python-opencv
- Save this script somewhere, say
- Run it via
Instead of the average brightness, I'm now getting the maximum brightness of a small tumbnail (this is to avoid dead pixel problems and make it faster). And at least with my combination of lights and camera, it works rather well!
Give it a try (:
Take a look into the RedShift project, which changes the screen temperature based on your geographic location as F.Lux was formerly doing.
Instructions on installing and how to use are well documented in the website and, depending on your hardware and monitor you can feel your eyes like "refreshed" by the nice effect which is achieved by RedShift.
To add the PPA, press Ctrl+Alt+T on keyboard to open the terminal. When it opens, run the command below:
sudo add-apt-repository ppa:fantasyleague0629/wildguppy
Then install WildGuppy via:
sudo apt-get update; sudo apt-get install wildguppy
Works on Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 and Ubuntu 12.04.
Make WildGuppy running at startup:
Run command to edit the config file.
sudo gedit ~/.config/autostart/wildguppy-gtk.desktop
Type in your password when prompted. Note that terminal will not display your password when typing, just type in mind and hit enter.
When the file opens, paste below content and save it.
[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=
I also made a C tool for that, using OpenCV. You can find it at https://launchpad.net/brightness (you have to compile it by your own). I hope it will help you.
You may use https://github.com/Wandersalamander/Dimmer which does exactly what you asked for.
This works for 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)
I've developed a C app which does this. See https://github.com/goglecm/AutoBrightnessCam .
fswebcam to take pictures, can be configured with
systemd to start automatically and detects whether the laptop is discharging (then it kicks in).