需求:opencv 将图像打上logo并保存这张图片,如下图,将logo 打到 image上,融合函数主要在于方法
addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);
void addWeighted(InputArray src1, double alpha, InputArray src2,
double beta, double gamma, OutputArray dst, int dtype = -1);
参数1:src1,第一张图.
参数2:alpha,第一张图alpha
参数3:src2 第二张图
参数4:beta,第二张图alpha
参数5:gamma,图1与图2作和后添加的数值, 具体看下面公式。不要太大,不然图片一片白。总和等于255以上就是纯白色了。
dst = src1[i] * alpha + src2 * beta + gamma;
参数6:dst,输出图片
注意:输出数组深度位CV_32S时,这个函数不适用,这时可能会内存溢出或者结果不对。
void mixImages() {
Mat image = imread("images/alpha.png");
Mat logo0 = imread("images/logo.png");
Mat logo ;
// 缩小logo
resize(logo0, logo, Size(0.5*logo0.cols, 0.5*logo0.rows));
Mat imageROI;
//在image mat中取出要打上logo的位置进行融合
//方法1
//imageROI = image(Rect(10, 20, logo.cols, logo.rows));
//方法2
imageROI = image(Range(10, 10 + logo.rows), Range(20, 20 + logo.cols));
addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);
imshow("融合", image);
//compression_params 为存些图片的参数
vector<int> compression_params;
compression_params.push_back(IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9); //png格式下,默认的参数为3.
try {
// cv 创建的窗口无法显示透明,所以会发现显示的是jpg的图片,保存后用 window图片查看器看图就会有透明显示
imwrite("addlog.jpg", image, compression_params);
imwrite("addlog.png", image, compression_params);
}
catch (runtime_error& ex) {
fprintf(stderr, "save image erro %s\n", ex.what());
return;
}
}