You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:24:04