void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray
dst, int dtype=-1)
参数1:InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
参数2:alpha,表示第一个数组的权重
参数3:src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
参数4:beta,表示第二个数组的权重值。
参数5:dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
参数6:gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
参数7:dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
addweighted函数的计算公式:
dst = src1[i] * alpha + src2[i] * beta + gamma
这里需要注意的是,当设置输出数组的深度为CV_32S时,该函数就会出错,或者计算结果完全不正确。
int main()
{
Mat src1 = imread("D:\\c plus plus\\test1111.jpg");
Mat src2 = imread("D:\\c plus plus\\imagesaaa.jpg");
Mat output;
double alpha = 0.5;
double beta = 0.5;
if ((!src1.data) || (!src2.data))
{
cout << "error" << endl;
return -1;
}
addWeighted(src1, alpha, src2, beta, 10, output);
imshow("src1", src1);
imshow("src2", src2);
imshow("output", output);
waitKey(0);
return 0;
}
这里再两个图片直接叠加时需要保证两个图像的大小相等,但是大多数时候我们希望将一个图像叠加到另一个图像的指定位置上,这样就需要使用ROI来实现对指定位置的图像叠加。再设置ROI时也可以使用copyto函数来直接将图片叠加上去。
bool ROI_AddImage();
bool LinearBlending();
bool ROI_LinearBlending();
//初级图像混合
int main()
{
if (ROI_AddImage() && LinearBlending() && ROI_LinearBlending())
{
cout << "ok" << endl;
}
waitKey(0);
return 0;
}
bool ROI_AddImage()
{
Mat add1 = imread("D:\\c plus plus\\test1111.jpg");
Mat add2 = imread("D:\\c plus plus\\line_test.png");
if ((!add1.data) || (!add2.data))
{
return false;
}
Mat ROI_add = add2(Rect(10, 10, add1.cols, add1.rows));
Mat make = imread("D:\\c plus plus\\test1111.jpg", 0);
add1.copyTo(ROI_add, make);
imshow("ROI_AddImage", add2);
return true;
}
bool LinearBlending()
{
Mat src1 = imread("D:\\c plus plus\\test1111.jpg");
Mat src2 = imread("D:\\c plus plus\\imagesaaa.jpg");
Mat output;
double alpha = 0.5;
double beta = 0.5;
if ((!src1.data) || (!src2.data))
{
cout << "error" << endl;
return -1;
}
addWeighted(src1, alpha, src2, beta, 10, output);
imshow("LinearBlending", output);
}
bool ROI_LinearBlending()
{
Mat add1 = imread("D:\\c plus plus\\test1111.jpg");
Mat add2 = imread("D:\\c plus plus\\line.png");
if ((!add1.data) || (!add2.data))
{
return false;
}
Mat ROI_add = add2(Rect(10, 10, add1.cols, add1.rows));
addWeighted(ROI_add, 0.5, add1, 0.5, 0.0, ROI_add);
imshow("ROI_LinearBlending", add2);
}