1. cv::add()
两个矩阵简单的相加运算,将src1中的所有元素加到src2中的相应元素中,并将结果放入dst中。可以使用加法或累加运算符实现。dst = src1 + src2; 或src2 += src1;
函数原型:
void cv::add(
cv::InputArray src1,
cv::InputArray src2,
cv::OutputArray dst, // result array
cv::InputArray mask = cv::noArray(), // optional, do only where nonzero
int dtype = -1 // Output type for result array
);
dst_i = saturate(| src1_i + src2_i |)
2. cv::addWeighted
cv::addWeighted()函数与cv::add()类似,但cv::addWeighted()的计算公式是:
dst_i = saturate(src_i * α + src2_i * β + γ)
cv::addWeighted()函数原型:
void cv::addWeighted(
cv::InputArray src1, // First Input array
double alpha, // Weight for first array
cv::InputArray src2, // second input array
double beta, // weight for second input array
double gamma, // offset added to weight sum
cv::OutputArray dst, // result array
int dtype = -1
);
如果两个源图像的类型相同,那么可以是任意类型,可以有任意通道。
该函数的应用之一是可以实现alpha混合(本质上是实现透明效果)。alpha混合时,α(取值在0-1之间)是src1的混合强度,将β=1-α,γ设置为0,可以转换为标准的alpha混合方程:
dst_i = asturate(src1_i * α + src2_i * (1-α))
示例代码:
std::string str_src1 = "alpha_src1.jpg";
std::string str_src2 = "alpha_src2.jpg";
cv::Mat img1 = cv::imread(str_src1.c_str());
cv::Mat img2 = cv::imread(str_src2.c_str());
if (img1.empty() || img2.empty()) {
std::cout << "ERROR: Open image FAIL!\n";
return;
}
int nX = 66; // 如下值按照需要更改
int nY = 16;
int nROIW = 246 - nX;
int nROIH = 161 - nY;
double alpha = 0.4;
double beta = 1 - alpha;
double gamma = 0.0;
cv::Mat roi1(img1, cv::Rect(0, 0, nROIW, nROIH));
cv::Mat roi2(img2, cv::Rect(nX, nY, nROIW, nROIH));
cv::addWeighted(roi1, alpha, roi2, beta, gamma, roi1);
cv::namedWindow(str_src1, cv::WINDOW_NORMAL);
cv::imshow(str_src1, img1);
cv::waitKey(0);
cv::destroyAllWindows();
结果显示
|