Opencv:如何使图像适合非矩形轮廓?

时间:2015-09-17 16:01:21

标签: opencv contour

我想把脸上的小丑形象塑造成另一张脸(一个人)的轮廓。 我正在检测人脸并获得类似椭圆的轮廓。 我可以找出中心,半径,最高,最低,最左边和最右边的点。

如何将小丑脸(一张方形图像,我可以通过将一个png的空白背景中的面部切割成椭圆形,然后检测轮廓)装入人脸?

或者至少,我如何将多边形拟合到另一个多边形中。

我可以轻松地将矩形图像拟合成矩形轮廓,但面部不是那么形状。

Python更可取,但C ++也是可管理的,谢谢。

编辑:按要求进行视觉表示:

我有

我希望这样做:

但是我希望小丑的脸能够伸展到脸部的脸部并且适合蓝色轮廓。

2 个答案:

答案 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,以了解缩放图像所需的量,以确保覆盖所有面部。