Приложение Megabite от Аарона Рэнделла использует фотографию еды, анализирует каждую отдельную составляющую вашего блюда, затем меняет всё местами, чтобы получить забавную мордочку на тарелке. Под катом — видео и описание алгоритма.
Пользователь снимает еду с помощью приложения, размер фото меняется до 1000х1000 пикселей, а затем обрезается по контуру тарелки.
На следующем шаге приложение ищет отдельные предметы, определяя их контуры. Приложение применяет ооператор обнаружения границ изображения Кэнни (2), и получает три изображения для последующей работы (3, 4, 5). Затем в ход идёт функция OpenCV findContours для обнаружения контуров каждой детали. Контуры на изображении ниже отмечены красным цветом. Затем алгоритм отфильтровывает «дочерние» контуры — например, желток в яичнице.
Каждый полученный контур приложение переворачивает, чтобы вписать в минимальный ограничивающий прямоугольник — минимальную площадь, которая будет содержать в себе изображение в максимальном масштабе. Процесс повторяется для всех шести деталей в примере.
В приложении есть шаблоны, которые используются для расположения отдельных деталей. Ниже — три примера, с количеством полигонов от трёх до шести.
Затем приложение выбирает шаблон по количеству деталей. В этом примере — шесть деталей, поэтому мордочка получится с ушами и носом. Затем полигоны и части изображения сортируются по размеру и подбираются по парам.
На следующем этапе детали размещаются на шаблоне таким образом, чтобы еда занимала максимально возможную площадь каждого из полигонов.
Такое лицо в итоге получилось из жареных яиц с беконом и тостом. Автор пишет, что приложение пока работает только с подобными этой фотографиями и пока имеет множество ограничений.
Подготовка изображения
Пользователь снимает еду с помощью приложения, размер фото меняется до 1000х1000 пикселей, а затем обрезается по контуру тарелки.
Обнаружение контуров
На следующем шаге приложение ищет отдельные предметы, определяя их контуры. Приложение применяет ооператор обнаружения границ изображения Кэнни (2), и получает три изображения для последующей работы (3, 4, 5). Затем в ход идёт функция OpenCV findContours для обнаружения контуров каждой детали. Контуры на изображении ниже отмечены красным цветом. Затем алгоритм отфильтровывает «дочерние» контуры — например, желток в яичнице.
Выделение контуров из изображения
Каждый полученный контур приложение переворачивает, чтобы вписать в минимальный ограничивающий прямоугольник — минимальную площадь, которая будет содержать в себе изображение в максимальном масштабе. Процесс повторяется для всех шести деталей в примере.
Размещение деталей на шаблоне
В приложении есть шаблоны, которые используются для расположения отдельных деталей. Ниже — три примера, с количеством полигонов от трёх до шести.
Затем приложение выбирает шаблон по количеству деталей. В этом примере — шесть деталей, поэтому мордочка получится с ушами и носом. Затем полигоны и части изображения сортируются по размеру и подбираются по парам.
На следующем этапе детали размещаются на шаблоне таким образом, чтобы еда занимала максимально возможную площадь каждого из полигонов.
Результат
Такое лицо в итоге получилось из жареных яиц с беконом и тостом. Автор пишет, что приложение пока работает только с подобными этой фотографиями и пока имеет множество ограничений.
Комментарии (11)
gris_stav
05.02.2016 20:49Удивительна мотивация автора приложения, который зачем-то использовал такие сложные алгоритмы для шуточного приложения.
Namynnuz
А теперь нужно прогнать результат через гугловскую нейросеть.