OpenCV图像中cv2.putText显示人数时出现重影跳变问题求助
问题分析与解决建议
核心问题原因
- 重复绘制人数文本:你在检测结果的循环内部执行
cv2.putText绘制人数,每遍历一个检测框就画一次人数。随着people数值递增,同一帧上会叠加多次文本导致重影;即使people不变,重复绘制也会让文字边缘模糊。 - 未清除旧文本背景:绘制人数时没有先覆盖之前的文本区域,当人数变化时,旧数字的像素无法被完全覆盖,残留形成重影。
- 字体高度变量复用风险:人数文本的
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
相关产品推荐
相关产品推荐

