ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

Виртуальный датчик освещенности из камеры наблюдения

23/03/2010 17:14:46

Возможно, данная статья устарела.
Все новые статьи

Уличное освещение или ночник в доме можно включать вручную, а если светильники подключены к управляемым ключам, то и автоматически, например, по времени. Но включать освещение по времени не совсем удобно, так как мы живем не на экваторе и длительность светового дня у нас далеко не константа. Да и с экономической точки зрения включать и выключать свет нужно вовремя и по определенному алгоритму. Так как я строил общую систему, где информация от любого модуля или сенсора могла быть использована в совершенно разных блоках управления Умным Дома, то датчик мне нужен был умный. Данные об освещенности могут быть использована не только для включения уличного освещения, но и, к примеру, для летнего полива растений. Садоводы-любители знают, что далеко не вся флора хорошо переносит дождеобразный полив при жгучих прямых солнечных лучах. Можно придумать еще массу всяких применений этому параметру: естественной освещенности.

Самое правильное и очевидное решение этой проблемы - фотодатчик, например, с интерфейсом 1-wire. В Интернете можно найти немало различных схем с применением различных фотосенсоров. Необходимо будет всего-навсего нарисовать печатную плату, купить элементов, спаять и подключить. Но не зря говорят что лень - двигатель прогресса. И мне пришла в голову мысль использовать в качестве датчика освещенности подключенную к компьютеру камеру наблюдения. Фактически камера - это тот же датчик света, только гораздо более сложный. Поскольку для Web-интерфейса Умного Дома у меня уже формировались снапшоты каждую минуту, оставалось только написать программу для анализа изображения. Нужно было как-то определить снижение яркости картинки до определенного уровня, когда можно уже сделать вывод о наступлении вечерних сумерек. И я написал следующую простецкую программу на PHP.

$im = imagecreatefromjpeg("/var/www/snap/Camera1.jpg");

for($y=0; $y<480; $y++)
{
	for($x=0; $x < 640; $x++)
	{
		$rgb = imagecolorat($im, $x, $y);
		$rgb_tot = $rgb + $rgb_tot;
	}
}

$result = round($rgb_tot / 307200, 0);
$final = round($result / 1000000, 2);

if ( $final <= 4.83 && date('H') > 14 )
{
	// Включаем уличное освещение
	key_sw("ext_light", 1);
}

Несколько слов о работе программы. Во-первых, любые камеры наблюдения имеют встроенные механизмы автоподстройки яркости изображения. В связи с этим, используя камеру как датчик света, мы никогда не получим абсолютных значений освещенности. Этот механизм можно использовать только для выявления некоторого порогового значения, когда механизм автоподстройки уже находится на нижней границе. Во-вторых, полученное в результате работы алгоритма значение (4.83), которое говорит мне что наступил вечер, зависит от типа камеры, места ее установки, формируемой камерой картинки. То есть значение это в каждом случае свое, индивидуальное и определяется чисто экспериментальным путем. Важно, что для данной задачи лучше подходят традиционные недорогие камеры, не оснащенные высокочувствительными CCD-матрицами, которые видят в темноте. В моем случае используется черно-белая камера, требующая минимальную освещенность 0.05 Lux. Это решение работало бы лучше, если бы использовалась менее чувствительная камера, к примеру, 0.1 Lux. И последнее, если камера установлена в зоне, которая и требует освещения, то используя предложенную программу можно включить лампу, но нельзя ее выключить! Невозможно будет определить, когда же наступил день. В таком случае нужно либо использовать изображение с другой камеры, которая не направлена на освещаемую область, либо выключать свет по расписанию, либо... паять модуль с фотодатчиком. Но устанавливать последний также нужно в том месте, где нет искусственного освещения.

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2010-03-24 21:56:08 | sigma17
Рад появлению новой информации. Ваш сайт для меня источник очень полезной информации по 1wire. Спасибо.


2010-03-26 15:16:55 | THK
Очень интересная идея! :) Я снапшоты не делаю, а записываю видео по детектору движения. Есть ли способ анализировать живое видео? Пока приходит на ум скрестить Вашу реализацию с www.lavrsen.dk/foswiki/bin/view/Motion/MjpegFrameGrabPHP (Program 2 - grabs one picture mjpeg stream) Может Вам встречалось что то готовое?


2010-03-26 17:34:50 | Andrey_B
ТНК, у меня используется ZoneMinder. Это программа позволяет просматривать любые камеры он-лайн, делать анализ изображения и производить запись по событиям, в том числе по движению. При этом ничто не мешает мне захватывать отдельные кадры раз в минуту. Собственно в моем Web-интерфейсе для системы Умного Дома с каждой камеры делается один снимок в минуту, для того чтобы иметь картинку происходящего. В случае доступа через Интернет - это оптимальное решение, которое не загружает канал доступа. А если мне требуется посмотреть камеру он-лайн, я нажимая на сам снимок и открывается уже окошко с ZoneMinder. При этом сам ZoneMinder независимо от того - работает ли Web-интерфейс или нет, просматриваю я какую-нибудь камеру или нет - захватывет и анализирует изображения с камер в фоновом режиме (если такой анализ включен для камеры, а, напомню, это требует определенных процессорных ресурсов). Так вот я делаю снапшот родными средствами ZoneMinder'а для Web-интерфейса, а заодно и сам анализирую изображение на предмет освещенности. По-моему мое вмешательство минимально, а остальное - все готовое.


2010-03-26 17:35:37 | THK
Andrey_B, разница в наших системах заключается в том, что я использую motion и не храню отдельные снимки с камер на диске (хотя такая возможность есть). Доступ к отдельным кадрам у меня обеспечивает скрипт, ссылку на который я давал. Вывод статичной картинки с камеры выглядит примерно так:
, где php_mj.php - указанный скрипт

Вот мне и стало интересно, как не сохраняя кадры (зачем хранить "мусор") заставить работать Ваш скрипт?


2010-03-26 19:34:50 | Andrey_B
ТНК, готовое решение вашей проблемы я не искал, но полагаю его при желании можно найти. Фактически скрипт будет выдирать из потока кадр и анализировать его не сохраняя на диске. Что касается "мусора" - вопрос спорный. Разве один файл на камеру размером 30-60Кб сильно засорит систему? Зато есть возможность сделать фотоархив, о котором я уже писал (это на самом деле представляет определенный интерес), а также высылать в некоторых ситуациях картинку на мобильный телефон. Впрочем, уже не за горами времена, когда посмотреть на телефоне видео через Интернет будет также легко, как включить телевизор.
Как вариант, можно сделать скрипт, который бы удалял "мусор" после своей работы ;)


2011-05-27 09:44:52 | Вася
Флора - растения
Фауна - животные ;)


2011-05-27 10:48:10 | Andrey_B
Спасибо, Вася. Но, думаю, фауна тоже не очень хорошо переносит дождеобразный полив. Я это установил опытным путем, попытавшись как-то полить своего кота.


2012-01-26 21:59:48 | bronny
Вспомнилась поучительная история с башорга:
Суровые российские монтажники: получили задание от начальника установить лампу освещения на входе в здание с автоматом выключения. Есть такие, вырубающие ток в светлое время суток. Собрали, подключили, а так как на дворе светлый день, то проверка прошла на ура. Закрыли датчик шапкой - темно. Лампа включается. Сняли шапку с датчика - светло. Лампа выключается. И с чувством выполненного долга ушли домой. Самый цирк начался поздно вечером, потому что датчик монтажники закрепили прямо над лампой. Всю ночь у дежурного была дискотека: стемнело - датчик лампу зажег, лампа зажглась и стало светло, а стало светло - датчик лампу гасит, ой опять темно - датчик лампу зажигает .... и так от заката до рассвета.


2013-05-13 12:37:17 | Павел
Немого поправленная функция

function LightSensor($img, $val, $out){
$source = imagecreatejpeg($img);
imagefilter($source, IMG_FILTER_GRAYSCALE);
$size = getimagesize($uploadfile);
for($y=0; $y