如何用Python将摄像头采集的视频叠加到中间透明的自定义边框指定区域
实现摄像头画面嵌入自定义透明边框的方案
实现原理
利用OpenCV对带Alpha通道的PNG边框和摄像头采集帧进行像素级融合,将视频画面填充到边框中间透明区域,保留边框的非透明装饰部分。
前置准备
- 将你需要使用的边框图片导出为带透明通道的PNG格式,存放到代码同级目录,命名为
border.png - 提前确认边框中间透明区域的坐标和尺寸(可通过画图工具打开边框图片查看像素位置)
代码修改步骤
你只需要修改原有代码中mode == "display"分支下的内容即可,具体修改点如下:
1. 新增边框加载逻辑
在启动摄像头cap = cv2.VideoCapture(1)的代码前,添加边框加载和预处理代码:
# 加载带透明通道的自定义边框 border = cv2.imread('border.png', cv2.IMREAD_UNCHANGED) # 统一边框的输出尺寸和原代码的显示尺寸一致:1600*960 border = cv2.resize(border, (1600, 960), interpolation=cv2.INTER_CUBIC) # 拆分边框的BGR色彩通道和alpha透明通道 border_bgr = border[:,:,0:3] border_alpha = border[:,:,3]/255.0 # 透明值归一化到0-1范围 # 配置边框中间透明区域的坐标,需根据你的实际边框调整 # 参数说明:roi_x=区域左上角x坐标,roi_y=区域左上角y坐标,roi_w=区域宽度,roi_h=区域高度 roi_x, roi_y, roi_w, roi_h = 150, 80, 1300, 800
2. 替换画面显示逻辑
把原循环末尾的画面显示代码:
cv2.imshow('Video', cv2.resize(frame,(1600,960),interpolation = cv2.INTER_CUBIC))
替换为帧融合逻辑:
# 将采集到的视频帧resize到匹配透明区域的尺寸 frame_resized = cv2.resize(frame, (roi_w, roi_h), interpolation=cv2.INTER_CUBIC) # 创建输出画布 output = border_bgr.copy() # 融合透明区域的视频帧和边框 roi_output = output[roi_y:roi_y+roi_h, roi_x:roi_x+roi_w] roi_alpha = border_alpha[roi_y:roi_y+roi_h, roi_x:roi_x+roi_w, None] output[roi_y:roi_y+roi_h, roi_x:roi_x+roi_w] = frame_resized * (1 - roi_alpha) + roi_output * roi_alpha # 非透明区域直接使用边框内容 output[border_alpha == 1] = border_bgr[border_alpha == 1] # 显示最终融合后的画面 cv2.imshow('Video', output)
注意事项
- 若边框透明区域的位置和尺寸匹配不对,可自行调整
roi_x, roi_y, roi_w, roi_h四个参数直到视频画面完全嵌入透明区域 - 若视频画面出现拉伸变形,可调整
roi_w和roi_h的比例和你的摄像头输出比例保持一致即可 - 确保你的边框图片为带透明通道的PNG格式,JPG格式无透明通道无法实现该效果
内容的提问来源于stack exchange,提问作者angel_30
相关产品推荐
相关产品推荐

