Блог от AS3Coder'a о JavaScript, HTML, CSS... и немного о Flash.

пятница, 27 августа 2010 г.

Распознавание лиц на изображении в ActionScript 3.0


На многих фотоаппаратах, даже самых простых "мыльницах" появилась такая функция, как распознавание лиц. Иногда, это действительно удобно и даже необходимо.

А ведь и мы имеем доступ к 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; // Список распознаных областей
  ...
}



Смотрите также:       

18 комментариев:

  1. Круто. Осталось только придумать этому применение в своих проектах :)

    ОтветитьУдалить
  2. Простите, но этой новости как минимум год а то и больше. Те кто знает LidSpark и имеет доступ к тому что они делают давно знают об этом.
    Касательно применения, в различных развлекательных проектах есть некое применение. Что то типа возьми свое лицо и примени его на какой то персонаж, тут нужно ещё и Papervision3D или аналог использовать, в общем есть применение но это довольно узкий круг компаний.

    ОтветитьУдалить
  3. Прощаю, ведь это действительно не новость :) А просто русскоязычный обзор того, как этим пользоваться :)

    ОтветитьУдалить
  4. Почему же узкий круг, применений можно найти массу, к примеру, автоматическая вырезалка аватаров из фоток для соцсетей -- юзер может загрузить любую фотку и получить аву, как на паспорт. Не надо быть таким занудой.

    ОтветитьУдалить
  5. отличная статья. все быстро понятно и доступно, предыдущие ораторы желуди.

    ОтветитьУдалить
  6. а как сделать чтоб распознавались глаза и губы? если использовать библиотеку от Mario Klingemann

    ОтветитьУдалить
  7. Никак :) Библиотека Mario Klingemann распознает только лица. Чтобы искать глаза и губы используйте решение от Eugene Zatepyakin.

    ОтветитьУдалить
  8. Для чего нужна эта опция?

    option = new ObjectDetectorOptions();
    option.min_size = 60;

    Без нее постоянная ошибка в _detect();
    Хотя и с ней очень часто возникает.

    ОтветитьУдалить
  9. Это минимальный размер области с лицом. Т.е. алгоритм не будет искать лица, которые имеют размер меньше этого значения.

    С ошибками зависящими от этой настройки не сталкивался. Можете привести полный текст ошибки? Возможно дело не в этой настройке.

    ОтветитьУдалить
  10. Без этой настройки постоянно возникает ошибка

    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()

    Какая-то проблема в самой библиотеке

    ОтветитьУдалить
  11. А сравнивать лица с катологом фотографий и определять личность этот пакет умеет?

    ОтветитьУдалить
  12. а исходник можешь выложить?

    ОтветитьУдалить
  13. Здравствуйте!Очень хотелось бы исходник. Если можно то на zap-world@ya.ru

    ОтветитьУдалить
  14. выше описанную ошибку можно просто исправить, добавив строчку:
    _options = new ObjectDetectorOptions();

    в конструкторе класса ObjectDetector
    тем самым мы создаем объект настроек с параметрами по умолчанию. Если надо менять параметры, тогда создаем экземпляр ObjectDetectorOptions и пихаем его в свойство options детектора.

    ОтветитьУдалить
  15. Очень очень, отличная статья, исходники на блогах разработчиков.

    ОтветитьУдалить
  16. Спасибо. Однажды сам использовал. Помогло

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например <b>, <i>, <a>

Поиск по блогу

Обо мне



Farid Shamsutdinov (AS3Coder)
Russia, Tatarstan, Kazan
as3coder@gmail.com

Подробнее...

Постоянные читатели

© 2014 Farid Shamsutdinov. При копировании материалов, ссылка на источник обязательна. Технологии Blogger.