OpenCV学习(18)

ROI区域图像叠加&图像混合(2):

计算数组加权和: addWeighted()函数


     这个函数的作用是计算两个数组(图像阵列)的加权和。原型如下:
void (InputArray src1,double alpha,InputArray src2,double beta,doublegamma,OutputArray dst, int dt ype=-1);
  第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat;
  第二个参数,double类型的alpha,表示第一个数组的权重;
  第三个参数,InputArray类型的src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数;
  第四个参数,double类型的 beta,表示第二个数组的权重值;
  第五个参数,double类型的gamma,一个加到权重总和上的标量值。其含义通过接下来列出的式子自然会理解;
  第六个参数,OutputArray类型的 dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数;
  第七个参数,int类型的dtype,输出阵列的可选深度,有默认值-1。当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
下面的数学公式表示:用addWeighted 函数计算以下两个数组(src1和 src2)的加权和,得到结果输出给第四个参数,也就是addWeighted 函数的作用的矩阵表达式。
              dst = src1[I] *alpha+ src2[1 ] *beta + gamma ;
    其中Ⅰ是多维数组元素的索引值。而且,在遇到多通道数组的时候,每个通道都需要独立地进行处理。另外需要注意的是,当输出数组的深度为CV_32S时,这个函数就不适用了,这时候就会内存溢出或者算出的结果压根不对。
示例代码如下:


//---------------------------------【头文件、命名空间包含部分】-----------------------------
//		描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/utils/logger.hpp>
using namespace cv;
using namespace std;


//--------------------------------------【LinearBlending函数】--------------------------------------
//	函数名: LinearBlending ()
//描述:利用cv: : addweighted()函数实现图像线性混合
//-----------------------------------------------------------------------------------------------

bool LinearBlending()
{
	//定义一些局部变量
	double alphaValue = 0.5;
	double betaValue;
	Mat srcImage2, srcImage3, dstImage;
	//读取图像(两幅图片需要有同样的类型和大小)
	srcImage2 = imread("E:/pictures/slg1.png"); 
	srcImage3 = imread("E:/pictures/slg2.png");
	if (!srcImage2.data)	
	{
		printf("读取srcImage2错误~!\n"); 
		return false;
     }
    if (!srcImage3.data) 
	{
	printf("读取srcImage3错误~! ln");
	return	false;
    }
	//做图像混合加权操作
	betaValue = (1.0 - alphaValue);
	addWeighted(srcImage2, alphaValue, srcImage3, betaValue,0.0,dstImage);
	//创建并显示原窗窗口
	namedWindow("<2>线性混合示例窗口【原图】",1);
	imshow("<2>线性混合示例窗口【原图】", srcImage2);
	namedWindow("<3>线性混合示例窗口【效果图】",1); 
	imshow("<3>线性混合示例窗口【效果图】 ", dstImage);
	return true;
}

int main()
{
	cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件
	cout << LinearBlending() << endl;
	waitKey();
	return 0;
}

运行结果如图:

OpenCV学习(18)

 

上一篇:FPGA电梯控制系统


下一篇:js调用摄像头