如何在网络摄像头Feed上覆盖png?

时间:2020-06-09 08:38:07

标签: python opencv image-processing overlay

我有一个形状为(480,640,4)的png图像和形状为(480,640,3)的网络摄像头框架。我想将png完全覆盖在网络摄像头Feed上,但是出现以下错误:

added_image = cv2.addWeighted(frame,0.4,png,0.1,0)

错误:

cv2.error:OpenCV(4.2.0)/io/opencv/modules/core/src/arithm.cpp:669: 错误:(-209:输入参数的大小不匹配)操作为 都不是“数组操作数组”(其中数组的大小相同, 相同数量的通道),“数组运算标量”,“标量运算数组” 在函数“ arithm_op”中

是由于渠道差异造成的问题。有人可以帮我解决这个问题吗? 预先感谢!

3 个答案:

答案 0 :(得分:1)

这是因为图像的尺寸不同。您必须将PNG图像从BGRA转换为BGR。然后错误应该消失了。

png = cv2.cvtColor(png, cv2.COLOR_BGRA2BGR)
added_image = cv2.addWeighted(frame,0.4,png,0.1,0)

答案 1 :(得分:1)

如果您使用addWeighted(),则背景图片上的所有位置都会获得相同比例的重叠图片。这似乎不太可能是您想要的,因为您的输入图像具有4通道,其中一个可能是alpha通道。因此,通常您希望背景图片根据alpha通道的显示方式有所不同。

将其作为形状为(500,300,3)的背景(网络摄像头)图像:

enter image description here

这是具有透明度和形状(500,300,4)的覆盖图像:

enter image description here

import cv2
import numpy as np

# Read background and overlay images
bg = cv2.imread('buckinghampalace.jpg')
ol = cv2.imread('overlay.png', cv2.IMREAD_UNCHANGED) 

# Make a result image that is either the background image or the overlay image depending on the alpha channel being < 128
res = np.where((ol[...,3]<128)[...,None], bg, ol[...,0:3])

cv2.imwrite('result.jpg', res)

enter image description here

答案 2 :(得分:0)

这是因为您的图像具有不同数量的通道(一个是4通道,另一个是3通道)。如果您查看有关addWeighted()的文档。它说到第一个源图像(src1)和第二个源图像(src2):

src1:第一个输入数组。

src2:第二个输入数组,其大小和通道号与src1相同。