每天一個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);
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章