Умное видеонаблюдение (smart home video control - surveillance), IPCAM RTSP, THREAD, FTP, Email, Events, PHash). Продолжение проекта умного дома (безопасность), система видеонаблюдения, 7 камер, получение тревожных событий (email, ftp) просмотр событий за сутки, библиотека pHashCalc для сравнения изображений.
Проект умного дома
Система видеонаблюдения
1. Предисловие
Системы видеонаблюдения – сегодня самое эффективное техническое средство обеспечения безопасности, позволяющее мониторить обстановку на объекте, контроль за технологическими процессами, присматривать за домашними питомцами или детьми, фиксировать факт совершения кражи и т.д.
Запись изображения камерами и его просмотр, возможность обобщения и анализа информации, просмотр видеоматериала его редактирование и обработка полученных данных задача программного обеспечения.
Основное программное обеспечение, которое применяется для управления системами видеонаблюдения, может быть либо фирменным софтом, который приобретается вместе с оборудованием, либо разработками независимых компаний.
Сложная настройка, нагруженное излишним функционалом, невозможность подстроить под свои задачи, основная проблема программного обеспечения, поэтому возникает потребность создания интерфейса, который был бы максимально понятным и простым.
2. Замысел
В моем случае видеокамеры (IP) приобретались на https://aliexpress.ru, из-за низкой стоимости (не более 3 тыс рублей на момент покупки) в разное время и от разных производителей Hikvision (с китайской прошивкой, невозможностью обновлять прошивки и использовать российское облако для просмотра удаленно), SIMICAM (SIMICAM Digital Store) более свежие недорогие камеры, все камеры оснащены датчиками движения, SIMICAM еще имеют микрофон.
Для просмотра удаленно через облако был приобретен регистратор IPTRONIC NVR0450Pi (9-ти канальный NVR регистратор со встроенным PoE коммутатором, рассчитанный на работу с 5МП сетевыми камерами в режиме реального времени).
Регистратор оказался в деле неплохим, если не учитывать, что портов PoE 4 для 9 канального регистратора, зоны по датчику движения в регистраторе с моими камерами работать не стали (в службе поддержки объяснили, что они работают только с камерами iptronic), хотя протокол ONVIF присылает тревогу от камеры в регистратор.
Поэтому было решено написать программное обеспечение на протоколе rtsp для получения тревожных сообщения (с изображениями) по датчику движения от камер через электронную почту и ftp, а для видео потока использовать регистратор (хотя можно использовать и камеру).
Один планшет в доме уже был задействован под систему умного дома, поэтому использовался второй :).
3. Реализация
ПО написано на Kotlin, MVVM, получения почты, извлечения изображений, создание папок и записи файлов, выполнения расчета перцептуального хеша (pHash) выполняются в фоновом пуле потоков с использованием корутин (coroutines).
новая версия выложена на плеймаркете: Goggle Play
3.1 Расположение элементов экрана
Расположение элементов
В нижней части экрана слева направо кнопки с камерами, активность протокола видеопотока rtsp, кнопка снятия скриншота, количество событий (сработок камерой датчика движения), количество сообщений (электронных писем с изображениями), текущим временем, кнопкой настроек приложения, кнопкой переключения режимов (видео \ просмотр событий).
3.2 Режим просмотра видео
Протокол rtsp (источник).
Потоковый протокол реального времени (англ. real time streaming protocol, сокр. RTSP) — прикладной протокол, предназначенный для использования в системах, работающих с мультимедийными данными (мультимедийным содержимым, медиасодержимым), и позволяющий удалённо управлять потоком данных с сервера, предоставляя возможность выполнения команд, таких как запуск (старт), приостановку (пауза) и остановку (стоп) вещания (проигрывания) мультимедийного содержимого, а также доступа по времени к файлам, расположенным на сервере. Разработан IETF в 1998 году и описан в RFC 2326.
например, в регистраторе iptronic используется путь: rtsp://логин:пароль@IP_адрес:554/0 – первый (главный) поток;
или
Создание скриншотов выполняется только при отображении потокового видео.
3.4 Режим просмотра событий (тревожных изображений с камер видеонаблюдения) за сутки
Описание функционала режима просмотра
Список событий (изображений), зафиксированных датчиком движения камеры, отображается в компоненте recyclerView, у меня камеры Hikvision отправляют три изображения (JPG) по датчику движения, а SIMICAM по одному, кроме того SIMICAM может отправлять изображения по датчику движения не только JPG (JPEG), но и BMP.
3.5 Использование JPEG, BMP
- Joint Photographic Experts Group (JPEG);
- Bitmap Picture(BMP);
offset size description
0 2 signature, must be 4D42 hex ("BM")
2 4 size of BMP file in bytes (unreliable)
6 2 reserved, must be zero
8 2 reserved, must be zero
10 4 offset to start of image data in bytes
14 4 size of BITMAPINFOHEADER structure, must be 40
18 4 image width in pixels
22 4 image height in pixels
26 2 number of planes in the image, must be 1
28 2 number of bits per pixel (1, 4, 8, or 24)
30 4 compression type (0=none, 1=RLE-8, 2=RLE-4)
34 4 size of image data in bytes (including padding)
38 4 horizontal resolution in pixels per meter (unreliable)
42 4 vertical resolution in pixels per meter (unreliable)
46 4 number of colors in image, or zero
50 4 number of important colors, or zero
Полный разбор формата JPEG описывать не буду (расписан подробно - источник1 , источник2)
fun loadJpegtoByte(fileName: String):ByteArray {
var bytes:ByteArray =byteArrayOf(0x00.toByte())
try {
val fis = FileInputStream(fileName)
bytes = ByteArray(fis.channel.size().toInt())
fis.read(bytes)
} catch (ex: IOException) {
}
return bytes
}
fun checkJpegArray(byteArray: ByteArray) {
var count = 0
while (count < (byteArray.size - 1)) {
if (byteArray[count].equals((0xff.toByte()))) {
when (byteArray[count]) {
StartOfImage -> {
println("Start of Image - $count")}
ApplicationDefaultHeader -> {
println("Application Default Header - $count")}
QuantizationTable -> {
println("Quantization Table - $count")}
StartOfFrame -> {
println("Start of Frame - $count")}
DefaultHuffmanTable -> {
println("Define Huffman Table - $count")}
StartOfScan -> {
println("Start of Scan - $count")}
EndOfImage -> {
println("End of Image - $count")}
}
}
count++
}
}
Функция разбора таблицы Хаффмана
Контроль за животными
3.6 Перцептивный (перцептуальный) хеш (pHash)
До применения pHash использовал алгоритм подсчета среднего цвета, тоже очень быстрый алгоритм, но он показывал большое количество ошибок и я вынужден был от него отказаться.
Алгоритм подробно описан в статьях (источник1 , источник2)
Если кратко, то выглядит так:
Под android данный код не работает, в связи с тем, что библиотеки AWT не поддерживается в Android, вам нужно изменить свою реализацию, чтобы использовать классы Android, тут придется писать код самостоятельно…
Upd. Для пользователей android я написал библиотеку pHashCalc, она выложена в Maven Central Repository, подключение и пример описаны на у меня на гитхабе.
Несколько алгоритмов расчета хеш-функций находятся на сайте https://www.phash.org/, там же вы можете сравнить 2 изображения, для контроля соответствия.
Количество получаемых тревожных событий напрямую зависит от правильно настроенных датчиков движения камеры.
3.7 Отображение событий
В событии указывается номер по порядку, время изображения, разница между соседними изображениями перцептуальный алгоритм pHash.
Ниже отображается панель навигации с временной шкалой, часы, соответствующие произошедшим событиям активны, нажатием на время отображаем событие этого часа, возможность перелистывания по 10 изображений (вперед\назад), а также свайп по изображению.
При нажатии кнопки phash в левой панели все изображения выше порогового значения, установленного в настройках, убираются.
При нажатии на кнопку play происходит автоматическое перелистывания выбранных изображений.
При нажатии на кнопку слияние события со всех камер собираются в общий список в зависимости от времени события для дальнейшего просмотра или применения фильтра.
3.8 Получение событий
Отправка камерой сообщений происходит по различным событиям в зависимости от настроек (датчик движения, потеря связи [не знаю, как в этой ситуации происходит], окончание жесткого диска или карты памяти и т.д.
По электронной почте (FTP)
Проверка электронной почты осуществляется с периодичностью указанной в настройках программы и выполняется в фоновом режиме. После происходит извлечение почты и сохранение в основную память планшета (папка download + создание папок в зависимости от названия камеры, даты, и времени), следующим этапом идет подгрузка сообщений в список или добавление в него при уже созданном списке и заключительным этапом рассчитывается pHash разницы в изображениях.
3.9 Пример использования
4.0 Итоги
Алгоритм pHash работает достаточно быстро и достоверно, эффективность работы можно увидеть на скриншоте (ссылка), в среднем из 100 изображений отобранных камерой остается не более 4 -10. На 40 изображений вместо 1000 можно потратить время ))), а если серьезно максимально жестко настроить датчики движения камер, там огромное количество настроек.
Расширения для Joomla