LINUX.ORG.RU
ФорумTalks

Выполнение разных команд в зависимости от освещенности


0

3

Еще давно у меня возникла идея написать программу, которая снимала бы изображение с вебкамеры, рассчитывала среднюю освещенность картинки в течении некоторого промежутка времени, и в зависимости от уровня освещенности выполняла различные действия(меняла тему оформления, подсветку экрана и т.д.). Вот и дошли у меня до этого руки и я написал программку. Называется dlight, распространяется под GPLv3. В зависимостях имеет libcv-dev и libhighgui-dev. Чтобы скомпилить и установить говорим «make && sudo make install». Затем запускаем в режиме дебага и смотрим текущий уровень освещенности:

drull@ubuntu:~/src/dlight$ dlight --debug
Webcam connected!
Window created.
Using config: /home/drull/.config/dlight/dlight.conf ...Success
average_time = 20

Period was set to 20 seconds
0:30:gtk-theme-switch2 /usr/share/themes/Ambiance/
41:90:gtk-theme-switch2 /usr/share/themes/Crux/

select timeout
Average:33,000000, Time:1, Current brightness:33
Average:33,000000, Time:2, Current brightness:33
Average:33,333333, Time:3, Current brightness:34
Average:34,250000, Time:4, Current brightness:38
Average:34,200000, Time:5, Current brightness:34
Average:33,000000, Time:6, Current brightness:26
Average:31,857143, Time:7, Current brightness:25
Average:32,125000, Time:8, Current brightness:39
Average:34,222222, Time:9, Current brightness:49
Average:34,000000, Time:10, Current brightness:33
Average:34,000000, Time:11, Current brightness:34
Average:34,000000, Time:12, Current brightness:34
Average:33,923077, Time:13, Current brightness:34
Average:33,928571, Time:14, Current brightness:34
Average:33,933333, Time:15, Current brightness:34
Average:33,937500, Time:16, Current brightness:34
Average:33,941176, Time:17, Current brightness:34
Average:33,722222, Time:18, Current brightness:30
Average:33,473684, Time:19, Current brightness:29
Average:33,300000, Time:20, Current brightness:30

Average: 33,300000, command sh -c 'gtk-theme-switch2 /usr/share/themes/Crux/' executed
Average:31,000000, Time:1, Current brightness:31
Average:31,500000, Time:2, Current brightness:32
Average:31,666667, Time:3, Current brightness:32
Average:31,750000, Time:4, Current brightness:32
Average:31,800000, Time:5, Current brightness:32
Average:32,000000, Time:6, Current brightness:33
^C

Открываем конфиг (~/.config/dlight/dlight.conf) и записываем в него строки вида:

<min>:<max>:<command>
где <min> и <max> - нижняя и верхняя граница уровня освещенности(смотрим их значения в режиме дебага), при которых будет выполнена комманда <command>.

Скачать можно с svn'a на сорсфорже:

svn co https://dlight.svn.sourceforge.net/svnroot/dlight dlight

★☆☆☆

Последнее исправление: drull (всего исправлений: 4)

Ответ на: комментарий от kernelpanic

Возможно. Щас поправлю.

drull ★☆☆☆
() автор топика
Ответ на: комментарий от exception13

Что бы ты использовал?

drull ★☆☆☆
() автор топика

А что будет, если освещенность все время находится в окрестности <min>, то чуть выше, то чуть ниже?

Еще нужно усреднение по времени: если кто-то на секунду-другую заслонил камеру от света, это еще не повод включать ночную тему.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

> А что будет, если освещенность все время находится в окрестности <min>, то чуть выше, то чуть ниже?

Тогда нужно выставить в конфиге другие значения границ, лучше всего подходящих под твое помещение.

Еще нужно усреднение по времени: если кто-то на секунду-другую заслонил камеру от света


Так и сделано. Для этого в конфиге есть параметр average_time=<seconds>

drull ★☆☆☆
() автор топика
Ответ на: комментарий от drull

> Тогда нужно выставить в конфиге другие значения границ, лучше всего подходящих под твое помещение.

Это же зависит от погоды за окном: то солнечно, то пасмурно, то рассвет, то закат. Замучаешься подбирать.

Не лучше ли будет делать так: запоминать, какая граница сработала последней. И команду выполнять только при пересечении второй границы.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

> Это же зависит от погоды за окном: то солнечно, то пасмурно, то рассвет, то закат. Замучаешься подбирать.

можно прикрутить зависимость к показаниям любого погодного виджета ))

Komintern ★★★★★
()

Интересно, но освещённость изображения с камеры также зависит от того, что отображается на мониторе. Т.е. освещенность при чтении ЛОРа пасмурным утром и освещенность при чтении википедии тёмной ночью будет примерно одна. Или я не прав?

libfun
()
Ответ на: комментарий от libfun

Думаю это зависит от камеры. У меня при выключенном свете ночью освещенность колеблется в районе 5-8, независимо от того что на мониторе, а днем меньше 20 редко бывает.

drull ★☆☆☆
() автор топика
Ответ на: комментарий от Manhunt

> Не лучше ли будет делать так: запоминать, какая граница сработала последней. И команду выполнять только при пересечении второй границы.

Я у себя в конфиге между разными интервалами сделал промежутки в пару-тройку единиц. Например 1-20, 25-35, 40-80. Так что если освещенность колеблется в районе ~20+-2, то команда для второго промежутка(25-35) выполнятся не будет.
И да, спасибо, ты натолкнул меня на мысль что если средняя освещенность несколько раз подряд попадет в один и тот же интервал, то команды соответствующие этому интервалу тоже выполнятся несколько раз подряд. Пофиксил.

drull ★☆☆☆
() автор топика
Ответ на: комментарий от Yareg

> это же лампочка на камере будет непрерывно гореть!

У тебя есть лампочка на камере? О_о

drull ★☆☆☆
() автор топика
Ответ на: комментарий от abraziv_whiskey

> Я, может, чего-то недопонял, но гистерезис рулит.

++

isden ★★★★★
()
Ответ на: комментарий от Turbo_Mascal

> Костыль какой-то велосипедный. Фотодиоды же есть.

у меня есть в ноуте встроенный датчик освещенности. но как до него добраться программно - яхз. и сдается мне, что никак.
а просто тупо фотодиод - к нему надо паять обвязку. а вебкамеры почти во всех ноутах есть.

isden ★★★★★
()
Ответ на: комментарий от Yareg

>на ноутах почти на всех маленький светодиодик загорается, когда камера активна

Заклеить куском изоленты? :)

adepto
()

Завтра камеру подключу, потестю.

adepto
()
Ответ на: комментарий от drull

О-о

Петля гистерезиса, однако. Как раз для таких случаев. Когда ползет вверх - одни пороговые значения, когда вниз - другие.

abraziv_whiskey ★★★★★
()
Ответ на: комментарий от Yareg

> это же лампочка на камере будет непрерывно гореть!

И что с того? Постоянно горящая лампочка питания тебя не смущает?

drull ★☆☆☆
() автор топика

Пофиксил баг с утечкой памяти.

drull ★☆☆☆
() автор топика
Ответ на: комментарий от drull

Когда на камере горит лампочка, это значит что за тобой кто-то наблюдает! Это невыносимо! Так невозможно работать!

amomymous ★★★
()
Ответ на: комментарий от amomymous

Батенька, да у вас паранойя.

drull ★☆☆☆
() автор топика

Вробе бы у некоторых камер экспозиция подбирается сама так, чтобы изображение с камеры было в среднем серым. В этом случае определять освещенность по средней яркости пикселя неверно, нужно знать ещё выдержку камеры. Учитывается ли эта особенность?

mclaudt
()

запустил:


Average:31,052632, Time:19, Current brightness:36
Average:31,300000, Time:20, Current brightness:36
Average:31,523810, Time:21, Current brightness:36
Average:31,727273, Time:22, Current brightness:36
Average:31,913043, Time:23, Current brightness:36
Average:32,083333, Time:24, Current brightness:36
Average:32,240000, Time:25, Current brightness:36
Average:32,384615, Time:26, Current brightness:36
Average:32,518519, Time:27, Current brightness:36
Average:32,642857, Time:28, Current brightness:36
Average:32,758621, Time:29, Current brightness:36
Average:32,866667, Time:30, Current brightness:36
включил свет в комнате

Average:35,000000, Time:1, Current brightness:35
Average:34,000000, Time:2, Current brightness:33
Average:33,000000, Time:3, Current brightness:31
Average:32,500000, Time:4, Current brightness:31
Average:36,800000, Time:5, Current brightness:54
Average:39,666667, Time:6, Current brightness:54
Average:41,000000, Time:7, Current brightness:49
Average:41,500000, Time:8, Current brightness:45
Average:41,888889, Time:9, Current brightness:45
Average:42,200000, Time:10, Current brightness:45
Average:42,454545, Time:11, Current brightness:45
Average:42,750000, Time:12, Current brightness:46
Average:43,000000, Time:13, Current brightness:46
Average:43,214286, Time:14, Current brightness:46
Average:43,400000, Time:15, Current brightness:46
Average:43,625000, Time:16, Current brightness:47
Average:43,764706, Time:17, Current brightness:46
Average:43,944444, Time:18, Current brightness:47
Average:44,105263, Time:19, Current brightness:47
Average:44,250000, Time:20, Current brightness:47
Average:44,380952, Time:21, Current brightness:47
а теперь просто повернул вебку к люстре

Average:44,545455, Time:22, Current brightness:48
Average:46,086957, Time:23, Current brightness:80
Average:46,791667, Time:24, Current brightness:63
Average:47,440000, Time:25, Current brightness:63
Average:48,038462, Time:26, Current brightness:63
Average:48,592593, Time:27, Current brightness:63
Average:49,142857, Time:28, Current brightness:64
Average:49,655172, Time:29, Current brightness:64
Average:50,133333, Time:30, Current brightness:64
Average:64,000000, Time:1, Current brightness:64
Average:64,000000, Time:2, Current brightness:64
Average:64,000000, Time:3, Current brightness:64
Average:64,000000, Time:4, Current brightness:64
Average:64,000000, Time:5, Current brightness:64
Average:63,666667, Time:6, Current brightness:62
Average:63,428571, Time:7, Current brightness:62
Average:63,250000, Time:8, Current brightness:62

работает.

system-root ★★★★★
()
Ответ на: комментарий от mclaudt

> Вробе бы у некоторых камер экспозиция подбирается сама так, чтобы изображение с камеры было в среднем серым. В этом случае определять освещенность по средней яркости пикселя неверно, нужно знать ещё выдержку камеры. Учитывается ли эта особенность?

Пока что это не учитывал. Буду с этим разбираться, возможно и удастся получить/установить значение выдержки. Но судя по тестам значения освещенности достаточно сильно отличаются при включенном/выключенном свете и без учета экспозиции.

drull ★☆☆☆
() автор топика
Ответ на: комментарий от drull

реквестирую:
1) демона
2) возможность получение значения освещённости по запросу т.е. окромя ключа --debug ещё и --status например. (ну или как hddtemp, слушать на порту)

system-root ★★★★★
()
Ответ на: комментарий от system-root

> 1) демона

В последнее версии(см. свн либо https://sourceforge.net/projects/dlight/files/) демон уже есть. Достаточно запустить его без ключа --debug и он демонизируется. Pid-файл по умолчанию лежит в /tmp/dlight.pid. Его можно задать в конфиге параметром pif_filename = <pidfile>, либо ключем -p. Сигналом SIGHUP можно заставить перечитать конфиг.

2) возможность получение значения освещённости по запросу т.е. окромя ключа --debug ещё и --status например.


Да, нужная фича. Скоро займусь.

drull ★☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.