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

Opencv:如何将图像拟合到非矩形轮廓中?,opencv,contour,Opencv,Contour,我想将一张小丑般的脸的图像融入另一张脸(一个人)的轮廓中。 我正在检测人脸,得到一个椭圆形的轮廓。 我可以计算出中心、半径、最高点、最低点、最左边和最右边的点 我如何将小丑脸(一个正方形的图像,我可以通过从png的空背景中切掉脸,然后检测轮廓,使其变成椭圆形)融入人物的脸中 或者至少,如何将一个多边形拟合到另一个多边形中 我可以轻松地将矩形图像拟合到矩形轮廓中,但面不是那个形状 Python更可取,但C++也是可管理的,谢谢。 编辑:按要求显示: 我有 我想这样做: 但是我想让小丑脸伸展到

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

我如何将小丑脸(一个正方形的图像,我可以通过从png的空背景中切掉脸,然后检测轮廓,使其变成椭圆形)融入人物的脸中

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

我可以轻松地将矩形图像拟合到矩形轮廓中,但面不是那个形状

Python更可取,但C++也是可管理的,谢谢。 编辑:按要求显示:

我有

我想这样做:


但是我想让小丑脸伸展到男人的脸上,并适合蓝色轮廓。

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

因为人头是椭圆形的,你可以用它来给你4分。这将自动解决任何人歪着头的问题,因为无论角度如何,你都会知道哪个点是顶部、底部、左侧和右侧

查找椭圆的相关代码为:

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

RotatedRect ellipse = fitEllipse(Mat(contour));
您可以旋转图像

更新:


您可能还想找到轮廓,以了解缩放图像所需的比例,以确保覆盖所有面部。

我认为您要查找的关键字是
活动外观模型。首先,需要将模型拟合到位于轮廓内的第一个面()。然后,你应该把同一个模型放在小丑脸上。之后,由于两个面都安装了相同的模型,所以可以根据需要拉伸它


我自己没有使用AAM,我也不是这方面的专家,所以我的解释可能不够充分或可能不完全正确,但我相信它会给你一些帮助

我已经试过了,但它对我不起作用,因为如果面具有一个方形的下巴,脸可以在蓝色区域内看到,但在面具外面的中间的一个小空间。我认为这归结为,你要么必须使面具比脸大(或小),要么必须扭曲面具的形状(可能在不同的地方有不同的金额)为了符合脸型。两种方法都有折衷,有时两者都会显得有点滑稽。这似乎是一个解决方案,但我找不到一个可以理解的实现。为了做到这一点,你能提供更多关于AAM的信息吗?@Azazel说得好,在理解之前,你不会找到一个可以理解的AAM实现它背后的理论。此外,AAM是一个非常知名的主题,你不应该向我询问信息,你可以很容易地搜索它并找到很多关于它的信息。无论如何,这是第一篇关于它的论文,但我建议你找到一些关于这个主题的新论文并阅读它们。你也可以搜索关于活动形状模型的文章。
// Resize your mask with these sizes for optimum fit
ellipse.size.width
ellipse.size.height