Умное видеонаблюдение (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.

RTSP ссылка выглядит в настройках программы выглядит так:
rtsp://username:password@ip_address:port/ext
username - логин
password – пароль
ip_address – IP адрес камеры или регистратора
 port – порт (обычно 554)
ext - в зависимости от камеры или регистратора возможен различный путь:

например, в регистраторе iptronic используется путь: rtsp://логин:пароль@IP_адрес:554/0 – первый (главный) поток;

или 

универсальная ссылка для IP камер, NVR и DVR:
rtsp://admin:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.:554/ISAPI/Streaming/Channels/101
где:
rtsp — тип используемого протокола
admin — имя учетной записи
12345 – пароль используемой учетной записи
192.168.200.11 — IP-адрес камеры
554 — RTSP порт камеры (по умолчанию 554, может быть изменен в настройках)
101 - это 1 камера 1 поток
201 - это 2 камера 1 поток
102 - это 1 камера 2 поток
 
3.3 Создание скриншотов экрана видео

Создание скриншотов выполняется только при отображении потокового видео.

3.4 Режим просмотра событий (тревожных изображений с камер видеонаблюдения) за сутки

  Описание функционала режима просмотра

Список событий (изображений), зафиксированных датчиком движения камеры, отображается в компоненте recyclerView, у меня камеры Hikvision отправляют три изображения (JPG) по датчику движения, а SIMICAM по одному, кроме того SIMICAM может отправлять изображения по датчику движения не только JPG (JPEG), но и BMP.

3.5 Использование  JPEG, BMP

- Joint Photographic Experts Group (JPEG);

- Bitmap Picture(BMP);

Заголовок 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)

Основная структура JPEG по сигнатурам

    0xffd8: "Start of Image",
    0xffe0: "Application Default Header",
    0xffdb: "Quantization Table",
    0xffc0: "Start of Frame",
    0xffc4: "Define Huffman Table",
    0xffda: "Start of Scan",
    0xffd9: "End of Image"
 
 
Функция загрузки JPG

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
}

 

Функция проверки сигнатур JPG

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)

Если кратко, то выглядит так:

1. Уменьшить размер изображения до 8х8, так что общее число пикселей составляет 64. 
2. Убрать цвет. Маленькое изображение переводится в градации серого, так что хэш уменьшается втрое: с 64 пикселей (64 значения красного, 64 зелёного и 64 синего) всего до 64 значений цвета.
3.  Вычислить среднее значение для всех 64 цветов.
4.  Для каждого цвета получить 1 или 0 в зависимости от того, он больше или меньше среднего.
5. Построить хэш. Переведите 64 отдельных бита в одно 64-битное значение. Порядок не имеет значения, если он сохраняется постоянным.

Алгоритм на Java 

Под 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 Пример использования

smartHomeVideoControl

 4.0 Итоги

Алгоритм pHash работает достаточно быстро и достоверно, эффективность работы можно увидеть на скриншоте (ссылка), в среднем из 100 изображений отобранных камерой остается не более 4 -10. На 40 изображений вместо 1000 можно потратить время ))), а если серьезно максимально жестко настроить датчики движения камер, там огромное количество настроек.

<На главную>

 

Расширения для Joomla

Облако тегов