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

OpenCV图像中cv2.putText显示人数时出现重影跳变问题求助

问题分析与解决建议

核心问题原因

  1. 重复绘制人数文本:你在检测结果的循环内部执行cv2.putText绘制人数,每遍历一个检测框就画一次人数。随着people数值递增,同一帧上会叠加多次文本导致重影;即使people不变,重复绘制也会让文字边缘模糊。
  2. 未清除旧文本背景:绘制人数时没有先覆盖之前的文本区域,当人数变化时,旧数字的像素无法被完全覆盖,残留形成重影。
  3. 字体高度变量复用风险:人数文本的h复用了检测框置信度文本的高度,若没有检测到任何目标,h会未定义引发错误。

修正后的代码

def postprocess(result, image):
    people = 0
    detections = result.reshape(-1, 7)
    # 提前定义人数文本的字体参数,避免变量未定义
    font = cv2.FONT_HERSHEY_SIMPLEX
    font_scale = 1.7
    font_thickness = 3
    
    for i, detection in enumerate(detections):
        _, image_id, confidence, xmin, ymin, xmax, ymax = detection
        if confidence > 0.6:
            people += 1
            
            xmin = int(max((xmin * image.shape[1]), 10))
            ymin = int(max((ymin * image.shape[0]), 10))
            xmax = int(min((xmax * image.shape[1]), image.shape[1] - 10))
            ymax = int(min((ymax * image.shape[0]), image.shape[0] - 10))

            conf = round(confidence, 2)
            print(f"conf: {conf:.2f}")
            print((xmin, ymin),(xmax, ymax))

            # 绘制检测框
            cv2.rectangle(image, (xmin, ymin),
                          (xmax, ymax), (255, 255, 255), 5)

            # 绘制置信度文本背景与文本
            (conf_w, conf_h), _ = cv2.getTextSize(
                f"{conf:.2f}", font, font_scale, font_thickness)
            cv2.rectangle(image, (xmin, ymin + conf_h + 5),
                          (xmin + conf_w + 5, ymin), (255, 255, 255), -1)
            cv2.putText(image, f"{conf:.2f}", (xmin, ymin + conf_h),
                        font, font_scale, (0, 0, 0), font_thickness)

    # 循环结束后,统一绘制人数文本(仅绘制一次)
    text = f"People: {people}"
    (text_w, text_h), _ = cv2.getTextSize(text, font, font_scale, font_thickness)
    # 先绘制背景矩形,完全覆盖旧文本区域(背景色可根据视频实际调整)
    cv2.rectangle(image, (10, 10), (10 + text_w + 5, 10 + text_h + 5), 
                  (0, 0, 0), -1)
    cv2.putText(image, text, (10, 10 + text_h),
                font, font_scale, (255, 255, 255), font_thickness)

    return image, people

关键修改点

  • 将人数文本绘制逻辑移到循环外部,确保每帧只绘制一次人数,避免重复叠加。
  • 绘制人数前先画一个背景矩形,覆盖整个文本区域,彻底清除旧的文字残留。背景色可根据你的视频帧实际背景调整(比如浅色背景用白色)。
  • 单独计算人数文本的尺寸,不再复用检测框的字体高度,避免无检测结果时的变量未定义问题。
  • 统一提取字体参数为变量,方便后续调整维护。

内容的提问来源于stack exchange,提问作者bbartling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:45:35