Smorodov 579 Жалоба Опубликовано August 11, 2012 Поиграл сегодня с имеющимися либами, получилась забавная штука. Вставляет лицо с одной фотографии на другую. Программа сырая, но "для поиграть" вполне годится. FaceExchange.rar Каскад и ASM модель программа берет из поддиректории data (есть в архиве) в директории с ехе-шником. Перед компиляцией надо подправить пути к заголовочникам и lib-файлам. Я не использовал в морфинге внешние точки ASM-модели (пока руки не дошли), так что при сильных различиях пропорций лица программа выдает не такой хороший результат. Выравниваются глаза, рот, нос и брови (совмещается 21 точка). 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kilop 7 Жалоба Опубликовано August 11, 2012 о, здорово) а можешь литературу кинуть? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 11, 2012 Так, thin plate spline для морфинга. http://www.compvision.ru/forum/index.php?showtopic=744 Active Shape Models для нахождения точек лица (в архиве более новая моя редакция, правда все еще недооформленная). http://www.compvision.ru/forum/index.php?showtopic=15&st=80 (ближе к концу страницы) Остальное тривиально 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kilop 7 Жалоба Опубликовано August 11, 2012 спасибо результат эффектно смотриться)) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 11, 2012 Код пока сложновато читается. ASM - надо нормально в класс завернуть (сейчас на скорую руку). Если нужны какие то пояснения пишите, попробую прояснить. Еще, описания точек в файле landmarks.hpp. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kilop 7 Жалоба Опубликовано August 11, 2012 #include "opencv2/core/opengl_interop.hpp" #include "opencv2/nonfree/nonfree.hpp" надо обновить библиотеку=) по коду пробежал, пока много чего не понятно, буду по-тихоньку разбираться, сначала с теорией) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 11, 2012 Эти два заголовка можно просто убрать, это остатки экспериментов. Если коротко и крупноблочно, то там порядок действий такой: 1) загружаем 2 изображения - исходное (где лицо берем) и то куда хотим впихнуть лицо. 2) каскадами Хаара находим лица на обоих изображениях (встроено в ASM). 3) при помощи асм находим модель активной формы (сетка на лице, её можно прорисовать если раскомментировать пару строчек). 4) после того как нашли соответствующие сетки для обоих лиц, достаем оттуда точки (у меня сделано два варианта 21 точка и все точки). 5) по 21 точке рассчитываем сплайн (warp) между двумя изображениями. 6) находим для первой модели асм convex hull - это будет маской для наложения. Для convex hull вытаскивались все точки. 7) деформируем первое изображение. 8) деформируем маску. 9) сглаживаем маску гауссианом, чтообы сгладить переход на краях. 10) копируем изображение по маске. ЗЫ: для каждого модуля в архиве есть пример применения. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 13, 2012 (изменено) еще можно добавить пуассон блендинг. самое сложное это накладывать тени наверно(если это вообще возможно.) Изменено December 3, 2015 пользователем mrgloom Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано December 3, 2015 Полный цикл того же самого на питоне с использование stasmhttps://github.com/alyssaq/face_morpherСлайдыhttps://github.com/alyssaq/face_morpher_slides 2 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано December 3, 2015 +1 за пуассонов блендинг, склейку должно замаскировать почище Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
boriso 3 Жалоба Опубликовано December 3, 2015 Полный цикл того же самогоРешение получилось всё-таки немного другое. Тут обычный морфинг (или среднее), а в исходной задаче была замена. Может быть подскажите, что подправить, чтобы при преобразовании шла только геометрическая корректировка (морфинг), но всё время оставалось исходное изображение? То есть сделать уже функциональный аналог первой задачи. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
boriso 3 Жалоба Опубликовано December 3, 2015 Сам же и отвечу на свой вопрос.В facemorpher/warper.py есть test_local(), который вызывается при запуске python warper.py. Тут как раз и используется poisson_blend. Поправил пути к исходным картинкам и чтение точек, после чего заменил одно из смешиваемых изображений на исходное:# blended_img = blender.poisson_blend(dst_img1, dst_img2, mask) blended_img = blender.poisson_blend(dst_img1, base_img, mask) В результате получился эффект исходной программы по замене лиц: 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
boriso 3 Жалоба Опубликовано December 13, 2015 Реализация blender.poisson_blend() оказалась довольно медленной. Стал искать готовые решения. Тут нашёл, что в OpenCV уже есть метод cv2.seamlessClone. Вот результат применения исходного алгоритма и метода из OpenCV: Для себя пока не решил, какой результат больше нравится: правый или левый. Вы бы что выбрали? У OpenCV два режима: cv2.MIXED_CLONE и cv2.NORMAL_CLONE. Для замены cv2.MIXED_CLONE не подходит, начинают проявляться артефакты подменяемого изображения: Пока главное преимущество стандартного метода - это на два порядка более высокая производительность (на CPU). P.S. Надо бы ещё попробовать параллельную версию https://github.com/ealehman/parallel-poisson-blending 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано December 14, 2015 Тут в конце темы я писал про seamlessClone а так же про то что он использует solve для dense матриц, что не оптимально. Например библиотека Eigen может работать с sparse матрицами и будет работать быстрее, другое дело что вышеобозначенное решение позиционируется полностью на питоне( кроме stasm_util, но по идее можно было бы использовать PyStasm, но он походу кривой) и вообще говоря странно, что специализированное решение pyamg медленей (видимо потому что там только питоновский код). можете им зарепортить, что Opencv версия быстрее. https://github.com/alyssaq/face_morpher/issues п.с. левый результат лучше выглядит, т.к. правый глаз залит меньше рыжим краевым условием от волос. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
boriso 3 Жалоба Опубликовано December 14, 2015 8 hours ago, mrgloom said: п.с. левый результат лучше выглядит, т.к. правый глаз залит меньше рыжим краевым условием от волос. Слева - OpenCV. Ещё один аргумент против исходного алгоритма. P.S. Кстати, есть готовая библиотека-утилита https://github.com/fbessho/PyPoi, но качество смешивания не очень. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 15, 2015 Вот еще на питоне: http://www.sprestwood.com/2014_10_01_archive.html и исходник: https://github.com/sprestwood/GradientDomainCloning А вообще я делал на CPP+CUDA и все работало в реальном времени (см. аттач). Код опубликовать не могу, ибо он коммерческий . face_change.mpeg Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 31, 2016 Еще интересная реализация (правда исходники на МАТЛАБ). http://publications.3afifi.com/post/110716630653/videofacereplacementmpb PDF-ка: https://www.researchgate.net/profile/Mahmoud_Afifi2/publication/272179003_Video_Face_Replacement_System_Using_a_Modified_Poisson_Blending_Technique_%28Presentation%29/links/54de3d110cf2510fcee26cc3.pdf Video: Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах