Продолжение темы: "Сохранение изображения с 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; // Список распознаных областей ... }
Смотрите также: