Використовуйте веб-камеру, щоб визначити стан освітлення та налаштувати яскравість екрана


31

Чи є спосіб, щоб моя веб-камера відчула умови освітлення та відповідно регулювала яскравість екрана?

Відповіді:


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.


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 (його потрібно скласти самостійно). Сподіваюся, це допоможе тобі.


У мене це складено, але як ним користуватися?
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на автоматичний запуск і виявляє, чи розряджається ноутбук (тоді він запускається).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.