每天一个opencv函数:图像叠加操作addWeighted函数

函数原型
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);
}

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值