码迷,mamicode.com
首页 > 其他好文 > 详细

白底+透明底贴图

时间:2015-03-11 01:56:35      阅读:844      评论:0      收藏:0      [点我收藏+]

标签:opencv   mat   图片叠加   

<pre name="code" class="cpp">//白底不贴,遍历像素时,若为白色,则忽略,否则将像素值复制到背景上
//因为目标图片中可能含有白色点,并且对抠出的图片要求挺高的不然就会出现第二幅图的效果,所以这种方式局限性较大。


Mat hero = imread("2.jpg");
for (int i = 0; i < hero.rows; i++)
{
	for (int j = 0; j < hero.cols; j++)
	{
		int a = hero.at<Vec3b>(i, j)[2];
		int b = hero.at<Vec3b>(i, j)[1];
		int c = hero.at<Vec3b>(i, j)[0];

		if (!(a == 255 && b == 255 && c == 255))
		{
			background.at<Vec3b>(i + pos_x, j + pos_y)[2] = hero.at<Vec3b>(i, j)[2];
			background.at<Vec3b>(i + pos_x, j + pos_y)[1] = hero.at<Vec3b>(i, j)[1];
			background.at<Vec3b>(i + pos_x, j + pos_y)[0] = hero.at<Vec3b>(i, j)[0];
		}

	}
}
//透明底不贴,通过将图片保存为含有四通道的png格式,判断alpha值!=0,不贴透明底

Mat background = imread("back.jpg");
Mat hero = imread("2.png",-1);
for (int i = 0; i < hero.rows; i++)
{
	for (int j = 0; j < hero.cols; j++)
	{
		int a = hero.at<Vec3b>(i, j)[2];
		int b = hero.at<Vec3b>(i, j)[1];
		int c = hero.at<Vec3b>(i, j)[0];
		if (hero.at<Vec4b>(i, j)[3]  !=0)
		{
			background.at<Vec3b>(i + pos_x, j + pos_y)[2] = hero.at<Vec4b>(i, j)[2];
			background.at<Vec3b>(i + pos_x, j + pos_y)[1] = hero.at<Vec4b>(i, j)[1];
			background.at<Vec3b>(i + pos_x, j + pos_y)[0] = hero.at<Vec4b>(i, j)[0];
		}
	}
}	



将一个目标物体贴在选定的背景上这里介绍两种方式,其实实质是相同的。

用抠图软件将图像抠出,第一种是将图片存在一张白底的背景上,第二种是透明背景,效果如下:


技术分享


技术分享

技术分享

白底+透明底贴图

标签:opencv   mat   图片叠加   

原文地址:http://blog.csdn.net/u013298384/article/details/44188007

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!