当前位置:C++技术网 > 资讯 > opencv编程:18 两张图像进行叠加(二)

opencv编程:18 两张图像进行叠加(二)

更新时间:2016-08-03 21:21:19浏览次数:1+次

  假如要将一副图像a叠加到另一幅图像b中,可以通过将b中一块区域的图像内容替换为图像a的内容,这一篇将使用这种方法实现图像的叠加。这种方法的效果是图像b中的一块区域完全由图像a来代替,而不会像上一篇介绍的那样具有一定的透明度。

 先来看一下原图,


  要将opencv的图标叠加到Lena图像中,这里是叠加到了左上角,形成一种logo的效果,叠加位置可以随意选取,只要保证选取的区域在Lena图像内,选取的区域的大小必须是opencv图标的大小。


示例代码1,
Mat image=imread("lena.png");  //载入背景图像
Mat logo = imread("opencv.png");  //载如logo
Mat imageROI=image(Rect(0,0,logo.cols,logo.rows)); //获取感兴趣区域,即logo要放置的区域
logo.copyTo(imageROI);   //把一个矩阵复制到另一个矩阵
namedWindow("叠加");      //显示叠加图像
imshow("叠加",image);
waitKey(0);

效果如下,


  还有一种直观点的写法,就是用logo的每个像素值替换感兴趣区域对应像素的值,

示例代码2,
Mat image=imread("lena.png");  //载入背景图像
Mat logo = imread("opencv.png");  //载如logo
Mat imageROI=image(Rect(0,0,logo.cols,logo.rows)); //获取感兴趣区域,即logo要放置的区域
	for (int i=0;i<logo.cols;i++)
	{
		for (int j=0;j<logo.rows;j++)
		{
			imageROI.at<Vec3b>(Point(i,j)) = logo.at<Vec3b>(Point(i,j));
		}
	}
namedWindow("叠加");      //显示叠加图像
imshow("叠加",image);
waitKey(0);

 这种也是将一个矩阵复制到另一个矩阵,所以效果跟上面方法是一样的,效果如下,