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

车牌检测时消息提示框缺失及后续功能失效问题求助

自动车牌识别(ANPR)系统功能异常修复方案

核心问题分析

  • ocr_it函数提前终止逻辑:处理第一个检测框后立即return,若OCR结果为空或存在多检测框,后续流程直接中断;未处理无有效文本的场景。
  • 异常捕获过于宽泛:except:吞掉所有错误,导致无法定位check_registered、save_results等函数的执行故障。
  • 消息提示框时长错误:show_message_prompt默认duration=5(毫秒),窗口瞬间关闭,用户无法看到提示。
  • 无重复处理防抖机制:车牌持续出现在画面中时,每帧重复触发OCR、保存和提示,导致逻辑混乱。
  • 过滤条件转义错误:filter_text中>应为>,过滤逻辑失效。

具体修复代码

1. 重构ocr_it函数,遍历所有检测框并收集有效文本

def ocr_it(image, detections, detection_threshold, region_threshold):
    # 筛选符合阈值的检测结果
    scores = list(filter(lambda x: x > detection_threshold, detections['detection_scores']))
    boxes = detections['detection_boxes'][:len(scores)]
    classes = detections['detection_classes'][:len(scores)]

    width = image.shape[1]
    height = image.shape[0]

    plate_texts = []
    valid_region = None
    for idx, box in enumerate(boxes):
        roi = box * [height, width, height, width]
        region = image[int(roi[0]):int(roi[2]), int(roi[1]):int(roi[3])]
        reader = easyocr.Reader(['en'])
        ocr_result = reader.readtext(region)
        reader = None  # 释放资源

        text = filter_text(region, ocr_result, region_threshold)
        if text:
            plate_texts.extend(text)
            valid_region = region  # 记录第一个有效车牌区域

        plt.imshow(cv2.cvtColor(region, cv2.COLOR_BGR2RGB))
        plt.close()  # 关闭绘图窗口,避免阻塞
        print(text)

    print("ocr_it function is called")
    return plate_texts, valid_region

2. 修复filter_text中的条件转义错误

def filter_text(region, ocr_result, region_threshold):
    rectangle_size = region.shape[0] * region.shape[1]

    plate = []
    for result in ocr_result:
        length = np.sum(np.subtract(result[0][1], result[0][0]))
        height = np.sum(np.subtract(result[0][2], result[0][1]))

        # 修复转义错误,将>改为>
        if length * height / rectangle_size > region_threshold:
            plate.append(result[1])
    return plate

3. 缩小异常捕获范围,保留错误信息便于排查

try:
    text, region = ocr_it(image_np_with_detections, detections, detection_threshold, region_threshold)

    if len(text) > 0 and region is not None:
        is_registered, driver_photo, valid_until = check_registered(text[0], 'Car_plates.csv')

        # 保存结果
        entering_time, action, found = save_results(text, region, 'Realtime_results.csv', 'Realtime_Images',
                                                    is_registered)

        # 防抖处理:10秒内同一车牌不重复触发提示
        current_time = datetime.datetime.now()
        plate_key = text[0]
        if plate_key not in plate_times or (current_time - plate_times[plate_key]["last_processed"]).seconds > 10:
            if is_registered:
                valid_until_date = datetime.datetime.strptime(valid_until, "%Y-%m-%d")
                time_remaining = valid_until_date - current_time
                days_remaining = time_remaining.days

                if action == 'exit':
                    message = f"车牌 {text[0]} 于 {entering_time} 驶出。"
                    show_message_prompt(message)
                    if plate_key in plate_times:
                        del plate_times[plate_key]
                else:
                    message = f"车牌 {text[0]} 于 {entering_time} 驶入。"
                    show_combined_message_and_photo(message, driver_photo, 'Drivers')
                    plate_times[plate_key] = {"enter_time": entering_time, "last_processed": current_time}

                if days_remaining < 0:
                    message = f"车牌 {text[0]} 已过期,请联系安保人员。"
                    show_message_prompt(message)

                elif days_remaining <= 90:
                    message = f"车牌 {text[0]} 有效期不足3个月,请及时续费。"
                    show_message_prompt(message)

            else:
                show_message_prompt("车牌未注册,请联系安保人员。")
            plate_times[plate_key] = {"last_processed": current_time}

except Exception as e:
    # 打印错误信息,便于排查
    print(f"执行错误: {str(e)}")

4. 修复show_message_prompt的时长参数

def show_message_prompt(message, duration=5000):
    root = tk.Tk()
    root.withdraw()  # 隐藏主窗口

    def close_window():
        root.destroy()

    messagebox.showinfo("ANPR系统提示", message)
    root.after(duration, close_window)  # 5秒后自动关闭窗口
    root.mainloop()

5. 更新plate_times的结构定义

# 常量定义
detection_threshold = 0.7
region_threshold = 0.6
category_index = label_map_util.create_category_index_from_labelmap(files['LABELMAP'])
plate_times = {}  # 存储格式:{车牌号码: {"enter_time": 驶入时间字符串, "last_processed": 上次处理时间}}

额外建议

  • 确保Car_plates.csv存在且格式正确,包含Car Plate、Driver Photo、Valid Until字段。
  • 测试时关闭plt.show()(改为plt.close()),避免每次OCR弹出图片窗口阻塞程序。
  • 替换print语句为日志记录,便于长期维护和问题追溯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:09:55