如何使用OpenCv叠加图像?

如何叠加两张图片? 基本上我有一个没有alpha通道的背景,而不是一个或多个alpha通道需要叠加在一起的图像。

我尝试了以下代码,但覆盖结果很可怕:

// create our out image Mat merged (info.width, info.height, CV_8UC4); // get layers Mat layer1Image = imread(layer1Path); Mat layer2Image = imread(layer2Path); addWeighted(layer1Image, 0.5, layer2Image, 0.5, 0.0, merged); 

我也试过使用合并,但我在某处读到它不支持alpha通道?

我不知道这样做的OpenCV函数。 但你可以自己实现它。 它类似于addWeighted函数。 但是,不是0.5的固定权重,而是从覆盖图像的α通道计算权重。

  Mat img = imread("bg.bmp"); Mat dst(img); Mat ov = imread("ov.tiff", -1); for(int y=0;y(y,x)[3]; int alpha = 256 * (x+y)/(img.rows+img.cols); dst.at(y,x)[0] = (1-alpha/256.0) * img.at(y,x)[0] + (alpha * ov.at(y,x)[0] / 256); dst.at(y,x)[1] = (1-alpha/256.0) * img.at(y,x)[1] + (alpha * ov.at(y,x)[1] / 256); dst.at(y,x)[2] = (1-alpha/256.0) * img.at(y,x)[2] + (alpha * ov.at(y,x)[2] / 256); } imwrite("bg_ov.bmp",dst); 

请注意,我无法使用alpha通道读取文件,因为显然OpenCV不支持此function。 这就是为什么我从坐标计算出一个alpha值来获得某种渐变。

最有可能的合并渠道数与输入不同。 你可以替换

 Mat merged (info.width, info.height, CV_8UC4); 

有了这个:

 Mat merged; 

这样,您将让addWeighted方法使用正确的参数创建目标矩阵。