《OpenCV3编程入门》学习笔记5 Core组件进阶(二) ROI区域图像叠加&图像混合

第5章 Core组件进阶

5.2 ROI区域图像叠加&图像混合

5.2.1 感兴趣区域ROI(region of interest)

1.定义ROI区域两种方法:
(1)定义矩形区域Rect:指定矩形左上角坐标和矩形的长和宽
(2)指定感兴趣行或列的范围Range:Range是从起始索引到终止索引的一段连续序列
2. 示例:利用ROI实现图像叠加

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat srcimage = imread("love.jpg");
	Mat logoimage = imread("logo.jpg");
	Mat imageROI;
	imageROI = srcimage(Rect(100, 150, logoimage.rows, logoimage.cols));
	//imageROI = srcimage1(Range(150, 150 + logoimage.rows), Range(100, 100 + logoimage.cols));

	//加载掩膜,直接将插入的像素设置为logo图像的像素值(必须是灰度图)
	Mat mask = imread("logo.jpg", 0);
	//将掩膜复制到ROI
	logoimage.copyTo(imageROI, mask);

	namedWindow("<1>利用ROI实现图像叠加示例窗口");
	imshow("<1>利用ROI实现图像叠加示例窗口", srcimage);

	waitKey(0);
	return 0;
}

5.2.2 线性混合操作

1.理论公式:在这里插入图片描述
2.通过在范围0到1之间改变alpha值,来对两幅图像或视频产生时间上的画面叠化效果(即前后页缓慢过渡叠加效果)
3.实现:addWeighted函数

5.2.3 addWeighted函数:计算数组加权和

1.函数原型:void (InputArray src1,double alpha,InputArray src2,double beta,double gamma,OutputArray dst,int dtype=-1);
2.参数说明:第一个数组(常为Mat),数组权重,和第一个数组相同尺寸和通道数的第二个数组,第二个数组权重,加到权重总和上的标量值,输出的数组,输出阵列的可选深度(默认-1,等同于src1.depth)
3.矩阵表达式:dst=src1[I]*alpha+src2[I]*beta+gamma;其中I是多维数组元素的索引值
4.注意:当输出数组深度为CV_32S时,函数不适用,会内存溢出
5.示例:利用cv::addWeighted()函数实现图像线性混合

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	//【1】定义一些局部变量
	double alphaValue = 0.5;
	double betaValue;

	//【2】定义并读取图像
	Mat srcImage1 = imread("boy1.jpg");
	Mat srcImage2 = imread("girl1.jpg");
	Mat dstImage;
	if(!srcImage1.data) {printf("读取srcImage1图像错误~!\n"); return false; }
	if(!srcImage2.data) { printf("读取srcImage2图像错误~!\n"); return false; }

	//【3】图像混合加权操作
	betaValue = (1.0 - alphaValue);
	addWeighted(srcImage2, alphaValue, srcImage1, betaValue, 0.0, dstImage);

	namedWindow("<1>线性混合示例窗口【原图】", 1);
	imshow("<1>线性混合示例窗口【原图】", srcImage1);
	namedWindow("<2>线性混合示例窗口【效果图】", 1);
	imshow("<2>线性混合示例窗口【效果图】", dstImage);
	
	//【4】区域图像加权操作
	Mat srcImage3 = imread("girl1min.jpg");
	Mat ImageROI = srcImage1(Rect(100, 100, srcImage3.rows, srcImage3.cols));
	addWeighted(ImageROI, 0.5, srcImage3, 0.3, 0.0, ImageROI);
	namedWindow("<3>区域线性混合示例窗口【效果图】", 1);
	imshow("<3>区域线性混合示例窗口【效果图】", srcImage1);

	waitKey(0);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值