【Emgu.CV教程】4.3、无缝融合应用之SeamlessClone()
2024-01-10 08:49:17
? ? ? ??SeamlessClone()函数才是真正的无缝克隆,它可以将一张小一点的图片,复制到另一张大一点的图片中,并且复制的位置可以用户自己定义,先看一下它的函数介绍:
public static void SeamlessClone(
IInputArray src, // 输入图像,小一点的目标图像
IInputArray dst,// 输出图像,大一点的背景图
IInputArray mask, // 掩码图,单通道或者三通道都可以,非零部分不起作用
Point p, // 小一点的目标图像的中心在背景图像上的坐标
IOutputArray blend, // 输出图像
CloningMethod flags // 融合方式,有Normal、MonochromeTransfer、Mixed三种
)
? ? ? ? 假如说我们有一张尺寸比较小的擎天柱的图片,还有一个尺寸比较大的《金刚》电影海报,想把擎天柱拷贝到?《金刚》电影海报中去,就可以使用SeamlessClone()函数。
?? ? ? ? 定义参数:tMat = 擎天柱.jpg,bMat = 《金刚》海报.jpg,CloningMethod? = Normal,使用如下代码:
Mat tMat = targetMat.Clone();
Mat bMat = backgroundMat.Clone();
Mat dstMat = new Mat();
// 1、创建一个与目标图像尺寸相同的白色掩码图
Mat mask = new Mat(tMat.Size, DepthType.Cv8U, 3);
mask.SetTo(new MCvScalar(255, 255, 255));
// 2、定义目标图像在背景图像的位置
System.Drawing.Point p = new System.Drawing.Point(bMat.Width / 2, bMat.Height / 2);
// 3、SeamlessClone
CvInvoke.SeamlessClone(tMat, bMat, mask, p, dstMat, CloningMethod.Normal);
CvInvoke.Imshow("SeamlessClone image, " + dstMat.Size.ToString(), dstMat);
? ? ? ? ?效果就是这样,擎天柱已经拷贝到了海报的正中心。
? ? ? ? 又到了一步到胃的讲解阶段,注意以下几点哈:?
- SeamlessClone()函数里面,第一个是比较小的目标图像,比如上面例子的擎天柱.jpg。
- SeamlessClone()函数里面,第二个是比较大的背景图像,比如上面例子的《金刚》海报.jpg。
- 掩码图要和目标图像尺寸相同,执行SeamlessClone()函数时,非零部分才起作用。我的例子是一张纯白的图片,所以全部的擎天柱都拷贝过去了。
- Point p这个参数我选择的是背景图片的中心位置,也就是擎天柱图片的中心点要放在《金刚》海报的中心点上。
- CloningMethod? 选择的是 Normal,那MonochromeTransfer和Mixed是什么效果呢,请看下面:
? ? ? ? 记住了,Mixed方式效果最好,能去掉目标图片的背景。再举个例子:定义 tMat = 母猪.jpg,bMat = 碧海蓝天.jpg,CloningMethod? = Mixed,使用如下代码:
??
? ? ? ? 激动人心的时刻来了,看看下面的结果,母猪飞上天的效果十分明显吧。
? ? ? ? ?掩码的使用就不介绍了,读者们自己去试试吧。
原创不易,请勿抄袭。共同进步,相互学习。??
文章来源:https://blog.csdn.net/sswss12345/article/details/135472692
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!