车牌检测时消息提示框缺失及后续功能失效问题求助
自动车牌识别(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
相关产品推荐
相关产品推荐

