Пишу на PHP программу видеомониторинга (впринципе написал уже). Но мне не нравится алгоритм определения движения.
Я сравниваю два последних кадра с видеокамеры следующим образом:
1. Дроблю изображение на области (к примеру 10х10 pix) и подсчитываю среднее значение цвета всей области. Получается матрица значений по цвету.
2. Сравниваю две матрицы
|m1[i][j]-m2[i][j]| > Dгде D - дельта, отсекающая шумы
3. Получаем третью матрицу из двух значений, где 0 - область где нет разницы по цвету (или она меньше D), и 1 - там где разница больше D
4. В этой матрице ищем области скопления "1" (чистим еще раз от единичных "срабатываний" - шумов). И считаем величину этого скопления. Если она (величина) достаточная - есть движение.
Все довольно быстро работает, и не плохо срабатывает на движение. Но так же стабатывает на выход солнца из-за тучи (все изображение сильно меняет яркость).
Вот электронные датчики движение на такое не ведутся (солнце), и срабатываю на реальное ДВИЖЕНИЕ, а не изменение освещенности.
Усиленно гуглил - не смог найти описание хорошего (да какого либо) алгоритма определения движения. Может есть среди форумчан, кто интересовался этой проблемой или встречал что-то такое на просторах необъятного?
Подскажите!
Спустя 16 минут, 4 секунды (13.12.2011 - 16:55) alex12060 написал(а):
поищи на хабре
Спустя 9 минут, 23 секунды (13.12.2011 - 17:05) Winston написал(а):
Или здесь может чего полезного найдешь.
Спустя 5 часов, 20 минут, 35 секунд (13.12.2011 - 22:25) webjema написал(а):
Цитата (alex12060 @ 13.12.2011 - 13:55) |
поищи на хабре |
Спасибо! Нашел то что нужно http://habrahabr.ru/blogs/image_processing/134197/
Применил у себя - очень помогло.
Осталось откатать на практике =)
Спустя 32 секунды (13.12.2011 - 22:26) Invis1ble написал(а):
webjema
Цитата |
Вот электронные датчики движение на такое не ведутся (солнце), и срабатываю на реальное ДВИЖЕНИЕ, а не изменение освещенности. |
если не ошибаюсь - причина в фокусном расстоянии
Спустя 3 минуты, 29 секунд (13.12.2011 - 22:29) webjema написал(а):
Цитата (Invis1ble @ 13.12.2011 - 19:26) |
если не ошибаюсь - причина в фокусном расстоянии |
Так и что? И так и так зайчик будет.
Как крупное/мелкое изображение чтото изменит? Или глубина резкости?
У меня почти все резкое, кроме объектов возле самой камеры.
Спустя 1 день, 7 часов, 26 минут, 59 секунд (15.12.2011 - 05:56) I++ написал(а):
Если нужно определять только двинулось ли, что либо в комнате и все. Юзаем датчик объема и вот этот скрипт.
Библиотеку найдете надеюсь в интернетах. Winbinder надеюсь тоже прикрутите.
С LPT портом надеюсь справитесь. Работы на пару часов. Ложных срабатываний 0, если правильно датчик объема поставите, так же можно будет подключить до 8 устройств, и через WEB-сервер регистрировать всю лабуду и смски рассылать.
Конечно лучше сделать опторазвязку, можно еще прикрутить мультиплексор, датчик измнения сопротивления для обнаружения саботажа, но думаю это лишнее.
В свое время была моя дипломная работа :lol:
Библиотеку найдете надеюсь в интернетах. Winbinder надеюсь тоже прикрутите.
С LPT портом надеюсь справитесь. Работы на пару часов. Ложных срабатываний 0, если правильно датчик объема поставите, так же можно будет подключить до 8 устройств, и через WEB-сервер регистрировать всю лабуду и смски рассылать.
Конечно лучше сделать опторазвязку, можно еще прикрутить мультиплексор, датчик измнения сопротивления для обнаружения саботажа, но думаю это лишнее.
В свое время была моя дипломная работа :lol:
<?php
class dlportio {
private $library;
/**
* Загружает библиотеку "DLPORTIO.DLL" и переводит порт LPT в режим чтения
*/
function __construct(){
$this->library = wb_load_library("DLPORTIO.DLL");
$funcaddress = wb_get_function_address("DlPortWritePortUchar", $this->library);
wb_call_function($funcaddress,array(890,43));
}
/**
* Читает данные из порта LPT
*
* @return (int)array
*/
public function read(){
$funcaddress = wb_get_function_address("DlPortReadPortUchar", $this->library);
return $this->port_convert(wb_call_function($funcaddress,array(888)));
}
/**
* Возвращает массив портов
*
* @param (int) $bitstr
* @return (int)array
*/
private function port_convert($bitstr){
$bitstr = 255 - $bitstr;
$bits = array(128,64,32,16,8,4,2,1);
$ports = array(1=>1,2=>2,4=>3,8=>4,16=>5,32=>6,64=>7,128=>8);
$sports = array();
while($bitstr != 0){
foreach ($bits as $bit){
if($bit <= $bitstr){
$bitstr = $bitstr - $bit;
$sports[] = $ports[$bit];
}
}
}
return $sports;
}
}
?>
Спустя 3 часа, 6 минут, 20 секунд (15.12.2011 - 09:03) sergeiss написал(а):
Цитата (webjema @ 13.12.2011 - 17:39) |
и срабатывают на реальное ДВИЖЕНИЕ, а не изменение освещенности. |
Если честно, то с обработкой видео не связывался. Но выделенное мной предложение "наводит на мысли". Может быть, просто надо оценивать еще и общую освещенность, в дополнение к тому анализу, что ты уже делаешь? Вот находишь ты усреднение по 10 пикселам - так одновременно оцени и освещенность всей картинки.