Хочу рассказать про пару интересных способов кодирования данных - кодирование в виде картинки и встраивание их в уже существующую картинку. Я экспериментировал с форматом PNG, т.к. в нем используется сжатие без потерь и поддерживается в браузерах в элементе canvas. Мне интересен JavaScript, поэтому реализация будет именно на нем. Код реализован в виде JS-библиотеки и выложен на GitHub под лицензией MIT.
Первый вариант кодирования заключается в формировании новой картинки на основе произвольных данных. Для этого каждый байт данных записывается последовательно в RGB каналы картинки PNG, при этом альфа-канал не трогается, т.к. при изменении альфа-канала частично меняются RGB цвета при выгрузки из canvas в PNG. В этом варианте в PNG можно запаковать WIDTH * HEIGHT * 3 байт данных. При кодировании текста размер изображения получается меньше исходного текста, т.к. к данным применяется сжатие Deflate.
// encode file to PNGasPNG.encode(file).then(blob=>{// encoded blob});// decode file from PNGasPNG.decode(file).then(blob=>{// decoded blob});
Как-то давно в интернете нашел любопытное устройство - брелок на радиоизотопе водорода (тритий). Принцип работы там следующий: в герметичной полости находится изотоп, внутренняя часть полости покрыта люминофором, который светится при воздействии электронов, испускаемых в результате бета-распада трития. Период полураспада трития 12 лет, что обеспечивает непрерывное свечение люминофора в течении долгих лет.
Меня вдохновила эта идея и где-то в 2013 году появилась идея сделать брелок-маячок, чтобы он светился и был заметен в темноте долгое веремя. Можно для ключей использовать, можно еще как-нибудь, интересна была сама идея. Однако за основу я решил взять не радиоактивный элемент, а электрическую схему с обычным светодиодом. Оставалось заставить светодиод светиться долгие годы без замены элементов питания, при этом сохраняя габариты брелка.
Относительно недавно в OpenCV появился API для обнаружения антропометрических точек лица. По использованию Facemark API есть неплохая статья на Learn OpenCV. Хорошая реализация поиска таких точек есть в библиотеке dlib, однако иногда хочется ограничиться одной библиотекой, особенно если речь идет о портировании кода на мобильные устройства или браузер (кстати, OpenCV поддерживает компиляцию в WebAssembly). К сожалению, в алгоритмах поиска точек лица используются модели достаточно большого размера (68 точек ~ 54 МБ), а размер загружаемого кода на клиент может быть ограничен. В библиотеке dlib есть предобученная модель на 5 точек (5.44 MB), однако для OpenCV такой модели нет, причем нет даже поддержки такой модели, на данный момент поддерживаются модели на 68 и 29 точек. Модель на 5 точек может использоваться для нормализации лиц на клиенте. Ниже я опишу процесс обучения собственной модели небольшого размера на 5 точек.
Авторы статьи приводят пример реализации данного алгоритма на C с предобученным классификатором для детекции лиц. Недавно появилась реализация алгоритма PICO на JS, однако в ней нет реализации инвариантности к повороту изображения (или наклона головы влево/вправо). Эту недоработку я и решил исправить.
Для реализации инвариантности к повороту требуется несколько раз запустить алгоритм для повернутого на несколько разных углов изображения. Но так как алгоритм работает с пикселями, а не интегральным изображением, то можно не выполнять ресурсоемкую операцию поворота изображения, а просто читать нужные пиксели, используя матрицу поворота.
В доработку вошло:
реализация инвариантности к повороту;
переобученный классификатор лиц;
более производительный метод для преобразования RGBA изображения в оттенки сергого (grayscale);
Когда появляется задача передать некоторый код по аудио, то классическим решением являются DTMF коды. DTMF - это двухтональный многочастотный сигнал, используемый для набора телефонного номера. Однако реальное применение данной технологии гораздо шире.
Формат сигнала представляет собой сумму двух синусоидальных сигналов определенных частот. Символы DTMF кодируются следующими частотами:
Проблема роутера TL-WR841N (v9 в моем случае) в том, что там всего 4 МБ flash-памяти и после прошивки OpenWRT остается всего около 300 КБ для личного пользования, чего не хватает для установки OpenVPN. Решение этой проблемы есть в посте OpenWrt + VPNclient для роутера с 4mb ROM, но прошло несколько лет и скрипты требуют изменений.
В задачах автоматической обработки изображений лиц часто встает вопрос о нахождении и нормализации (выравнивании) изображения лица на фотографии или в видеопотоке. Выравнивание обычно включает в себя поворот, масштабирование и обрезку интересующей части фотографии. В сети можно найти примеры для реализации данной функции на Python или C/C++ с помощью библиотеки компьютерного зрения OpenCV. Здесь я приведу два примера реализации данной функции на JavaScript для NodeJS и для запуска в браузере на чистом JS.
Сегодня состоялся официальный выпуск Linux Deploy 2.0, включающий много новых разработок, которые велись последний год. Не все удалось реализовать из задуманного по тем или иным причинам, настало время разобраться что же именно поменялось и как с этим жить.
Linux Deploy поддерживает автоматическую установку и настройку нескольких наиболее распространенных окружений рабочего стола. В версии LD 2.0 оставлена поддержка окружений XTerm (терминал на весь экран), LXDE, Xfce и MATE. Эти окружения есть почти во всех поддерживаемых LD дистрибутивах, они не сильно требовательны к ресурсам и могут работать без графического ускорения. Однако запустить другие окружения рабочего стола можно вручную. Для этого нужно в настройках LD выбрать окружение рабочего стола “Другое” и выполнить команду “Конфигурировать”. После этого нужно подключиться к контейнеру, установить пакеты нужного окружения рабочего стола, и под пользователем (по умолчанию - android) отредактировать файл ~/.xsession, прописав команду запуска рабочего окружения.