Используйте веб-камеру для определения состояния освещения и регулировки яркости экрана.

31

Есть ли способ настроить условия освещения в моей веб-камере и соответственно отрегулировать яркость экрана?

zpletan
источник

Ответы:

11

Я улучшил свою предыдущую попытку :

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

При таком подходе две проблемы: Яркость экрана, по крайней мере, у моей веб-камеры, никогда не опускается ниже четырех, потому что камера плохо работает в темноте, и она может пропускать от четырех до пяти. Так или иначе,

Вот как это использовать:

  1. sudo apt-get install python-opencv
  2. Сохраните этот скрипт где-нибудь, скажем ~/test.py
  3. Запустите его через python test.py

Вместо средней яркости я теперь получаю максимальную яркость маленького миниатюры (чтобы избежать проблем с битыми пикселями и сделать это быстрее). И, по крайней мере, с моим сочетанием света и камеры, это работает довольно хорошо!

Попробуй (:

Стефано Палаццо
источник
1
Обратите внимание, что это очень упрощенный подход. Было бы очень легко получить взвешенную черно-белую гистограмму изображения вместо среднего арифметического пикселей (красный и синий не имеют одинаковую яркость). Кроме того, вы можете установить минимум, максимум и переключать его только после определенного уровня уверенности в том, что окружающий свет изменился. Но я не беспокоился из-за проблем, которые я упомянул. У него будут те же проблемы, что и у этого.
Стефано Палаццо
1
Хм, ну, это работает, как вы говорите. :)
zpletan
@zpletan еще раз; Я начал с нуля.
Стефано Палаццо
1
Кажется, это работает так, как я хочу. Спасибо! (И извините, что так долго отвечал.)
zpletan
1
Нет highguiот stackoverflow.com/questions/30684661/… . Есть ли другой способ?
Даниял
2

Взгляните на проект RedShift, который меняет температуру экрана в зависимости от вашего географического положения, как раньше делал F.Lux.

http://jonls.dk/redshift/

Инструкции по установке и использованию хорошо документированы на веб-сайте, и, в зависимости от вашего оборудования и монитора, вы можете чувствовать себя «освеженными» благодаря приятному эффекту, который достигается с помощью RedShift.

Geppettvs D'Constanzo
источник
1
Я не думаю, что это отвечает на вопрос, возможно, вам следует удалить свой ответ и вместо этого сделать комментарий к исходному вопросу. Ответы всегда должны прямо отвечать на вопрос.
Стефано Палаццо
Ваша ссылка не работает.
TheXed
1
Похоже, это не принимает во внимание ваше окружение? Так что, если бы я был в темной комнате в середине дня, это ничего бы не сделало?
zpletan
@zpletan Да, этот цвет только меняет цвет в зависимости от положения солнца.
Стефано Палаццо
Эта сторона ссылки, кажется, работает без проблем. Стефано Палаццо, извините, если вы не нашли мой ответ полезным. Тем не менее, я думаю, что кто-то еще может найти это полезным, если вы сохраните ответ. Твой выбор. Вы можете проголосовать, чтобы запросить удаление. :) Спасибо.
Geppettvs D'Constanzo
2

Чтобы добавить PPA, нажмите Ctrl+ Alt+ Tна клавиатуре, чтобы открыть терминал. Когда он откроется, выполните команду ниже:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Затем установите WildGuppy через:

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

Работает на Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 и Ubuntu 12.04.

Сделать WildGuppy работающим при запуске:

Запустите команду для редактирования файла конфигурации.

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

Введите ваш пароль, когда будет предложено. Обратите внимание, что терминал не будет отображать ваш пароль при вводе, просто запомните и нажмите Enter.

Когда файл откроется, вставьте содержимое ниже и сохраните его.

[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=
Даниал
источник
Эй, спасибо за ответ! Это именно то, что я искал в тот день, но, к сожалению, я больше не пользуюсь Ubuntu и не могу проверить (хотя я не знаю, почему это не сработало). Таким образом, я не чувствую себя комфортно, удаляя статус ответа на другом ответе, но надеюсь, что другие найдут это полезным, и в этом случае он будет быстро поставлен на первое место. Ура!
zpletan
@zpletan Welcom, Когда вы устанавливаете этот пакет, вы можете запустить скрипт Python, расположенный в /opt/wildguppy/wildguppy.py. Так что вы можете использовать этот пакет в любом дистрибутиве! Ура!
Даниял
@zpletan Я также внес некоторые изменения, чтобы рассчитать среднюю яркость, чтобы предотвратить быстрые и внезапные изменения яркости. github.com/Daniyal-Javani/autobrightness/blob/master/…
Даниял
0

Я также сделал для этого инструмент C, используя OpenCV. Вы можете найти его на https://launchpad.net/brightness (вы должны скомпилировать его самостоятельно). Я надеюсь, что это поможет вам.

pictuga
источник
Я скомпилировал, но как мне его использовать?
zpletan
0

Это работает для меня:

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

Я разработал приложение C, которое делает это. Смотрите https://github.com/goglecm/AutoBrightnessCam .

Он используется fswebcamдля фотографирования, может быть настроен systemdна автоматический запуск и определяет, разряжается ли ноутбук (затем включается).

Джон
источник