如何在OpenCV原始帧上绘制帧间阈值并解决addWeighted报错问题
报错原因
cv2.addWeighted 函数要求参与融合的两张图像必须具备完全相同的尺寸和通道数,你当前的原始帧是(1080, 1920, 3)的3通道彩色图像,阈值图是(180, 320)的单通道二值图像,两者尺寸、通道数均不匹配,因此会触发形状不匹配的报错。
实现方案
根据你的使用场景可以选择以下两种方案:
方案1:阈值图作为小预览窗叠加到原图角落(常用方案)
适合保留原图完整内容,仅额外展示阈值处理结果的场景,不会遮挡大部分画面内容。
操作步骤:
- 将单通道阈值图转换为3通道图像,匹配原图通道数
- 选定叠加的坐标位置,将阈值图覆盖/半透明融合到原图对应区域
示例代码:
import cv2 # 提前定义变量:frame为原始1080P彩色帧,thresh为(180,320)单通道阈值图 # 1. 单通道阈值图转3通道 thresh_3ch = cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR) # 2. 定义叠加位置:比如距离左上角20像素的位置 x_offset, y_offset = 20, 20 thresh_h, thresh_w = thresh_3ch.shape[:2] # 校验叠加区域不超出原图边界 if y_offset + thresh_h <= frame.shape[0] and x_offset + thresh_w <= frame.shape[1]: # 可选1:直接不透明叠加 # frame[y_offset:y_offset+thresh_h, x_offset:x_offset+thresh_w] = thresh_3ch # 可选2:带透明度叠加,alpha越大阈值图越明显 alpha = 0.6 roi = frame[y_offset:y_offset+thresh_h, x_offset:x_offset+thresh_w] frame[y_offset:y_offset+thresh_h, x_offset:x_offset+thresh_w] = cv2.addWeighted(roi, 1-alpha, thresh_3ch, alpha, 0)
方案2:阈值图放大后整图叠加
适合需要将阈值效果完整覆盖到原图对应区域的场景。
操作步骤:
- 将阈值图缩放到和原图完全一致的尺寸
- 转换为3通道后调用
addWeighted融合即可
示例代码:
import cv2 # 1. 将阈值图缩放到和原图完全相同的尺寸,注意cv2.resize的尺寸参数是(宽, 高) thresh_resized = cv2.resize(thresh, (frame.shape[1], frame.shape[0]), interpolation=cv2.INTER_NEAREST) # 2. 转换为3通道 thresh_3ch = cv2.cvtColor(thresh_resized, cv2.COLOR_GRAY2BGR) # 3. 整图融合 alpha = 0.4 frame = cv2.addWeighted(frame, 1-alpha, thresh_3ch, alpha, 0)
注:缩放时使用
cv2.INTER_NEAREST近邻插值可以保留二值阈值图的硬边缘,避免边缘模糊。
内容的提问来源于stack exchange,提问作者Christoph Acs
相关产品推荐
相关产品推荐

