Продолжение темы: "Сохранение изображения с Web-камеры"
На многих фотоаппаратах, даже самых простых "мыльницах" появилась такая функция, как распознавание лиц. Иногда, это действительно удобно и даже необходимо.
А ведь и мы имеем доступ к Web-камере во FlashPlayer, почему бы и нам не реализовать такой механизм?
Первый над этим вопросом видимо задумался Ohtsuka Masakazu, и портировал библиотеку компьютерного зрения OpenCV написанную на C++ на ActionScript 3.0 и опубликовал её на Spark project.
Работает механизм следующим образом: ему подсовывают .xml-файлы, в которых описываются необходимые свойства для распознавания тех или иных объектов, после чего идет поиск на изображении. Размер такого .xml-файла для распознавания лиц составляет что-то около 1 Мб и загружать его по сети не очень корректно. Тогда Ohtsuka Masakazu запаковал его в .zip-архив, который получился в 100 Кб. И уже загрузив архив, использую библиотеку FZip, он его распаковывал внутри FlashPlayer.
Казалось, всё прекрасно работает и можно с радостью использовать
Но не тут-то было. Лишний запрос на запакованный .xml-файл, лишний код для его распаковки - всё это не понравилось Mario Klingemann. Он избавился от загрузки внешнего .xml-файла переписав его содержимое в отдельный класс сократив его размер до 50 Кб. Также он провел некоторые оптимизации внутренних алгоритмов библиотеки.
Еще глубже в алгоритмы этого механизма окунулся Eugene Zatepyakin. Он добавил распознавание глаз, носа и губ. Подробнее смотрите здесь.
Как всем эти пользоваться?
Больше всего мне понравился вариант от Mario Klingemann. Для примера я буду использовать исходники библиотеки после его оптимизации.
Импортируем пакет классов jp.maaash. Создаем экземпляр класса ObjectDetector и подписываемся на событие ObjectDetectorEvent.DETECTION_COMPLETE.
import jp.maaash.*; ... var detector:ObjectDetector = new ObjectDetector(); detector.addEventListener(ObjectDetectorEvent.DETECTION_COMPLETE, onDetectorComplete);
Теперь мы можем попросить наш детектор распознать лица на заданном изображении. Вызываем у него метод detect c единственным параметром - ссылкой на данные изображения типа flash.bitmap.BitmapData.
detector.detect(bitmapData) // bitmapData - данные изображения, на котором следует которое следует распознать лица
После того, как распознавание закончится, детектор отправит соответствующее событие ObjectDetectorEvent.DETECTION_COMPLETE, в теле которого будет список распознанных областей.
private function onDetectorComplete (e:ObjectDetectorEvent):void { var arr:Array = e.rects; // Список распознаных областей ... }
Смотрите также:
Круто. Осталось только придумать этому применение в своих проектах :)
ОтветитьУдалитьПростите, но этой новости как минимум год а то и больше. Те кто знает LidSpark и имеет доступ к тому что они делают давно знают об этом.
ОтветитьУдалитьКасательно применения, в различных развлекательных проектах есть некое применение. Что то типа возьми свое лицо и примени его на какой то персонаж, тут нужно ещё и Papervision3D или аналог использовать, в общем есть применение но это довольно узкий круг компаний.
Прощаю, ведь это действительно не новость :) А просто русскоязычный обзор того, как этим пользоваться :)
ОтветитьУдалитьПочему же узкий круг, применений можно найти массу, к примеру, автоматическая вырезалка аватаров из фоток для соцсетей -- юзер может загрузить любую фотку и получить аву, как на паспорт. Не надо быть таким занудой.
ОтветитьУдалитьстарая тема
ОтветитьУдалитьотличная статья. все быстро понятно и доступно, предыдущие ораторы желуди.
ОтветитьУдалитьа как сделать чтоб распознавались глаза и губы? если использовать библиотеку от Mario Klingemann
ОтветитьУдалитьНикак :) Библиотека Mario Klingemann распознает только лица. Чтобы искать глаза и губы используйте решение от Eugene Zatepyakin.
ОтветитьУдалитьДля чего нужна эта опция?
ОтветитьУдалитьoption = new ObjectDetectorOptions();
option.min_size = 60;
Без нее постоянная ошибка в _detect();
Хотя и с ней очень часто возникает.
Это минимальный размер области с лицом. Т.е. алгоритм не будет искать лица, которые имеют размер меньше этого значения.
ОтветитьУдалитьС ошибками зависящими от этой настройки не сталкивался. Можете привести полный текст ошибки? Возможно дело не в этой настройке.
Без этой настройки постоянно возникает ошибка
ОтветитьУдалитьTypeError: Error #1009: Cannot access a property or method of a null object reference.
at jp.maaash.ObjectDetection::ObjectDetector/_detect()
at jp.maaash.ObjectDetection::ObjectDetector/detect()
at Main/init()
at Main()
Какая-то проблема в самой библиотеке
А сравнивать лица с катологом фотографий и определять личность этот пакет умеет?
ОтветитьУдалитьНет :)
ОтветитьУдалитьа исходник можешь выложить?
ОтветитьУдалитьЗдравствуйте!Очень хотелось бы исходник. Если можно то на zap-world@ya.ru
ОтветитьУдалитьвыше описанную ошибку можно просто исправить, добавив строчку:
ОтветитьУдалить_options = new ObjectDetectorOptions();
в конструкторе класса ObjectDetector
тем самым мы создаем объект настроек с параметрами по умолчанию. Если надо менять параметры, тогда создаем экземпляр ObjectDetectorOptions и пихаем его в свойство options детектора.
Очень очень, отличная статья, исходники на блогах разработчиков.
ОтветитьУдалитьСпасибо. Однажды сам использовал. Помогло
ОтветитьУдалить