您正在使用的命令是:
cv2.addWeighted(overlay, 1.0, output, 0, 0, output)
,其中
alpha = 1.0
,
beta = 0
,因此没有透明度。
基本上,您是在将
overlay
图像复制到
output
图像中。
AddWeighted
文档:
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
src1 - 第一个输入数组。
alpha - 第一个数组元素的权重。
src2 - 与src1大小和通道数相同的第二个输入数组。
beta - 第二个数组元素的权重。
dst - 具有与输入数组相同大小和通道数的输出数组。
您还可以使用以下代码覆盖文本:
output = frame.copy()
cv2.rectangle(output, (0, 0), (730, 50), (0, 0, 0), -1)
cv2.putText(output, fps, (1230, 20), cv2.FONT_HERSHEY_DUPLEX, 0.5, (255, 255, 255), 1)
如果要叠加 stat_overlay
,您可以使用像Alpha混合代码示例这样的解决方案。
我不知道'overlay.png'
是RGB还是RGBA格式。
如果图像具有alpha通道,则可以将其用作透明度平面。
如果图像是RGB,则可以创建所需的alpha平面。
如果'overlay.png'
是小图像(如标志),则可能不需要任何操作,您可以将小图像“放置”在output
图像上。
我创建了一个自包含的代码示例,基于alpha混合示例。
为了使代码自包含,代码使用:
以下是代码:
import ffmpeg
import cv2
import numpy as np
in_filename = 'Sample_Vid.mp4'
width, height = 640, 480
(
ffmpeg
.input('testsrc=size={}x{}:rate=1'.format(width, height), f='lavfi')
.output(in_filename, vcodec='libx264', crf=23, t=5)
.overwrite_output()
.run()
)
cap = cv2.VideoCapture('Sample_Vid.mp4')
stat_overlay = np.zeros((height, width, 4), np.uint8)
cv2.circle(stat_overlay, (320, 240), 80, (0, 0, 255, 255), thickness=20)
stat_alpha = stat_overlay[:, :, 3]
stat_alpha = cv2.cvtColor(stat_alpha, cv2.COLOR_GRAY2BGR)
stat_alpha = stat_alpha.astype(float) / 255
stat_overlay = stat_overlay[:, :, 0:3]
fps = 21
if cap.isOpened():
while cap.isOpened():
ret, frame = cap.read()
if ret:
output = frame.copy()
foreground = stat_overlay.astype(float)
background = output.astype(float)
foreground = cv2.multiply(stat_alpha, foreground)
background = cv2.multiply(1.0 - stat_alpha, background)
output = cv2.add(foreground, background).astype(np.uint8)
cv2.rectangle(output, (0, 0), (230, 50), (0, 0, 0), -1)
cv2.putText(output, str(fps), (123, 20), cv2.FONT_HERSHEY_DUPLEX, 0.5, (255, 255, 255), 1)
cv2.imshow('frame', output)
cv2.waitKey(1000)
else:
break
cv2.destroyAllWindows()
结果(最后一帧):
![在这里输入图片描述](https://istack.dev59.com/BT2r5.webp)