2015-09-17 2 views
4

Я хочу подогнать образ клоуна как лицо в контур другого лица (человека). Я обнаруживаю лицо лица и получаю эллиптический контур. Я могу определить центр, радиус, самый высокий, самый низкий, самый левый и самый правый.Opencv: Как подогнать изображение в непрямоугольный контур?

Как подобрать лицо клоуна (квадратное изображение, которое я могу сделать эллиптическим, вырезая лицо из пустого фона png, а затем обнаруживая контур) в лицо лица?

Или, по крайней мере, как мне поместить многоугольник в другой многоугольник.

Я могу легко разместить прямоугольное изображение в прямоугольном контуре, но лица не являются такой формой.

Python предпочтительнее, но C++ также управляем, спасибо.

Edit: Визуальное представление в соответствии с просьбой:

У меня есть

, и я хочу сделать это следующим образом:

, но я хочу клоуна лицо растянуть лицо парней и вписаться в синий контур.

ответ

0

Простым и хорошим ответом на этот вопрос является поиск крайних верхних, нижних, левых и правых точек на контуре (голове), а затем изменение размера маски в соответствии с аспектом рациона и размещение его для покрытия 4 точек ,

Поскольку человеческие головы эллиптические, вы можете использовать fitEllipse(), чтобы дать вам эти 4 очка. Это автоматически устранит любые проблемы с лицом, наклоняющим голову, потому что, независимо от угла, вы будете знать, какая точка - верхняя, нижняя, левая и правая.

Соответствующий код для нахождения Эллипс:

vector<Point> contour; 
// Do whatever you are doing to populate this vector 

RotatedRect ellipse = fitEllipse(Mat(contour)); 

Существует также example, а также documentation for RotatedRect.

// Resize your mask with these sizes for optimum fit 
ellipse.size.width 
ellipse.size.height 

Вы можете вращать изображение like this.

UPDATE:

Вы также можете найти контур extreme points-х, чтобы узнать, сколько вам нужно масштабировать изображение, чтобы гарантировать, что все лицо покрыто.

+0

Я уже пробовал это, но это не работает для меня, потому что, если у маски есть квадратная челюсть, лицо можно увидеть внутри синей области, но за пределами маски в маленьком промежутке между ними. – azazelspeaks

+0

Я думаю, что это сводится к тому, что вам придется либо сделать маску больше (или меньше), чем лицо, либо вам придется искажать форму маски (возможно, разные количества в разных местах), чтобы она соответствовала лицу. В обоих случаях есть компромиссы, и оба иногда выглядят немного забавными. –

1

Я думаю, что ключевое слово, которое вы ищете, это Active Appearance Models. Во-первых, вам нужно подгонять модель к первой грани (such as this one), которая лежит внутри контура. Затем вы должны поместить ту же модель на лицо клоуна. После этого, поскольку вы установили ту же модель на обе стороны, вы можете растянуть ее по мере необходимости.

Я сам не пользуюсь AAM, и я не эксперт в этом, поэтому моего объяснения может быть недостаточно или, возможно, не совсем правильно, но я уверен, что он даст вам insight.

+0

Кажется, это решение, но я не могу найти понятной реализации этого, чтобы иметь возможность сделать это, не могли бы вы предоставить более подробную информацию об AAM? – azazelspeaks

+0

@azazelspeaks Ну, вы не найдете понятной реализации AAM до понимания теории, стоящей за ней. Кроме того, AAM - очень известная тема, вы не должны запрашивать у меня информацию, вы можете легко найти ее и найти много информации об этом. Во всяком случае, вот первая статья об этом https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/cootes-eccv-98.pdf, но я предлагаю вам найти несколько новых статей по теме и читать их тоже. Также вам может понадобиться поиск в Active Shape Models. – guneykayim

Смежные вопросы