我想把脸上的小丑形象塑造成另一张脸(一个人)的轮廓。 我正在检测人脸并获得类似椭圆的轮廓。 我可以找出中心,半径,最高,最低,最左边和最右边的点。
如何将小丑脸(一张方形图像,我可以通过将一个png的空白背景中的面部切割成椭圆形,然后检测轮廓)装入人脸?
或者至少,我如何将多边形拟合到另一个多边形中。
我可以轻松地将矩形图像拟合成矩形轮廓,但面部不是那么形状。
Python更可取,但C ++也是可管理的,谢谢。
编辑:按要求进行视觉表示:
我有
我希望这样做:
但是我希望小丑的脸能够伸展到脸部的脸部并且适合蓝色轮廓。
答案 0 :(得分:1)
我认为您要查找的关键字是Active Appearance Models
。首先,您需要将模型拟合到第一个面(such as this one),它位于轮廓内。然后,你应该把相同的模型适合小丑脸。之后,由于您在两个面上都安装了相同的模型,因此可以根据需要进行拉伸。
我自己并没有使用AAM而且我不是它的专家,所以我的解释可能不够或可能不完全正确,但我相信它会给你一些insight。
答案 1 :(得分: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。
更新:
您可能还想找到轮廓的extreme points,以了解缩放图像所需的量,以确保覆盖所有面部。