Opencv:如何将图像适应非矩形轮廓?

5
我希望将小丑脸部的图片嵌入到另一个人脸的轮廓内。我正在检测人脸并获取类似椭圆形的轮廓。我可以计算出中心点、半径、最高点、最低点、最左和最右的点坐标。
如何将小丑脸 (一个正方形的图像,可以通过从 png 文件的空白背景中剪切脸部图像然后检测轮廓来使其成为椭圆形) 嵌入到人脸中?
或者至少如何将一个多边形嵌入到另一个多边形中。
我可以轻易地将矩形图像嵌入到矩形轮廓中,但是人脸不是那种形状。
首选 Python,但 C++ 也可行,谢谢。
编辑:如请求所示的视觉表示:
我有这个: 我想让它变成这样: 但我希望小丑脸能够延伸到人脸上,并适合于蓝色轮廓内。
2个回答

1

我认为你正在寻找的关键词是主动外貌模型。首先,你需要将模型适配到第一个脸部(例如这个)内部的轮廓上。然后,你应该将同样的模型适配到小丑脸上。之后,由于你已经将同一模型适配到两个脸上,你可以根据需要进行拉伸。

我自己没有使用过AAM,也不是它的专家,所以我的解释可能不足或者不完全正确,但我相信它会给你一些启示


这似乎是一个解决方案,但我找不到可理解的实现来完成此操作,您能提供有关AAM的更多信息吗? - azazelspeaks
@azazelspeaks 嗯,如果你不了解AAM背后的理论,就不会找到易于理解的实现方式。此外,AAM是一个非常知名的主题,你不应该向我询问信息,你可以轻松地搜索并找到大量关于它的信息。无论如何,这是有关AAM的第一篇论文https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/cootes-eccv-98.pdf,但我建议你也要找一些更新的论文来阅读。此外,你可能还想搜索关于主动形状模型的信息。 - guneykayim

0

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

由于人类头部是椭圆形的,因此您可以使用fitEllipse()来为您提供这4个点。这将自动解决任何人倾斜头部的问题,因为无论角度如何,您都将知道哪个点是顶部、底部、左侧和右侧。

查找椭圆的相关代码如下:

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

RotatedRect ellipse = fitEllipse(Mat(contour));

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

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

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

更新:

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


我已经尝试过这个方法,但对我来说不起作用,因为如果口罩有一个方形下巴,脸部可能会出现在蓝色区域内,但在口罩之间的小空间外面。 - azazelspeaks
我认为问题的关键在于,您必须将面具调整得比脸部更大(或更小),或者您必须扭曲面具的形状(在不同的地方可能是不同程度的)以适应脸部。这两种方法都有权衡之处,并且有时候看起来会有点奇怪。 - Rick Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接