【问题标题】:How to overlay a png on a webcam feed?如何在网络摄像头提要上覆盖 png?
【发布时间】:2022-01-01 07:55:44
【问题描述】:

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

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'中

是渠道差异造成的问题。有人可以帮我解决这个问题吗? 提前致谢!

【问题讨论】:

    标签: python opencv image-processing overlay


    【解决方案1】:

    如果您使用addWeighted(),您将在背景图像的任何地方获得相同的覆盖图像的恒定比例。这似乎不太可能是您想要的,因为您的输入图像有 4 个通道,其中一个可能是 alpha 通道。所以通常你会期望背景图像根据 alpha 通道以不同的方式显示。

    以此为背景(网络摄像头)图像,形状为 (500,300,3):

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

    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)
    

    【讨论】:

    • 你能给我解释一下
    • 通道 0,1,2 是叠加图像中的 RGB 值,而通道 3 是 alpha(透明度)层。该层为 255 的任何地方,覆盖图像都是 100% 透明的,并且背景(网络摄像头)将显示出来,该层为 0 的任何地方,覆盖图像都是 100% 不透明的,并且将完全隐藏背景(网络摄像头)图像。所以我说我将把 128 作为 50% 的透明点,小于我将覆盖 RGB 值放入输出图像中的任何值,以及大于我将网络摄像头 RGB 值放入输出图像中的任何值。
    【解决方案2】:

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

    src1:第一个输入数组。

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

    【讨论】:

    • 是的,你是对的!我通过将 rgba 转换为 rgb 来解决它,然后再将其提供给 addweight()。现在它的工作正常
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多