Opencv:如何将图像拟合成非矩形轮廓?

aza*_*aks 5 opencv contour

我想将像小丑一样的脸的图像放入另一张脸(一个人)的轮廓中。我正在检测人脸并获得椭圆形轮廓。我可以计算出中心、半径、最高点、最低点、最左边和最右边的点。

如何将小丑脸(我可以通过从 png 的空背景中切出脸部然后检测轮廓来制作椭圆形的方形图像)放入人脸中?

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

我可以轻松地将矩形图像放入矩形轮廓中,但面部不是那种形状。

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

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

我有

我想让它像这样:

但我希望小丑的脸伸展在男人的脸上并适合蓝色轮廓。

Ric*_*ith 0

这个问题的一个简单而好的答案是找到轮廓(头部)上的极端顶部、底部、左侧和右侧点,然后调整蒙版大小以匹配长宽比,并将其放置以覆盖这 4 个点。

因为人的头部是椭圆形的,所以你可以用它fitEllipse()来给你这 4 点。这将自动解决人们倾斜头部的任何问题,因为无论角度如何,您都会知道哪一点是顶部、底部、左侧和右侧。

寻找椭圆的相关代码是:

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

RotatedRect ellipse = fitEllipse(Mat(contour));
Run Code Online (Sandbox Code Playgroud)

还有一个示例以及文档RotatedRect。

// Resize your mask with these sizes for optimum fit
ellipse.size.width
ellipse.size.height
Run Code Online (Sandbox Code Playgroud)

你可以像这样旋转你的图像。

更新:

您可能还想找到轮廓的极值点,以了解需要将图像缩放多少以确保覆盖所有脸部。