如何用Python和Pandas DataFrame实现车牌字符串相似度匹配?
车牌匹配相似度检测实现问题
需求说明
- 用Pandas将采集到的车牌文本与Excel中的登记车牌DataFrame做对比
- 因OCR识别存在I与1、l混淆的误差,需实现字符相似度匹配逻辑:当登记车牌与采集车牌的7个字符中有6个相同时,执行通行通过操作
原代码问题分析
原代码存在语法错误与逻辑漏洞:
for plateR.iloc(pos) in registered_plates:遍历DataFrame的语法错误if plateR[i] == plateC[i]语句缺少冒号- 循环逻辑错误:仅对比第一个字符后就执行
break,无法完成全字符遍历 - 百分比计算公式括号不匹配,逻辑有误
- 变量名不一致:
placasR与定义的变量名不统一
修正后的代码
import pandas as pd # 初始化变量,collected_plate替换为实际采集到的车牌 collected_plate = "ABC123I" matched_plate = None match_count = 0 # 读取Excel中的登记车牌数据 xlsx_path = r"C:\My Computer\Downloads\Python\Project.xlsx" registered_plates = pd.read_excel(xlsx_path) # 假设Excel中车牌列名为"plate",请根据实际情况修改 plate_col = "plate" # 遍历所有登记车牌 for idx, row in registered_plates.iterrows(): reg_plate = str(row[plate_col]).strip() # 过滤非7位的无效车牌 if len(reg_plate) != 7 or len(collected_plate) != 7: continue # 统计匹配字符数,同时处理I/1/l的混淆问题 current_match = 0 for r_char, c_char in zip(reg_plate, collected_plate): # 将I、l、1视为等价字符,解决OCR识别误差 r_group = r_char.lower() in {'i', 'l', '1'} c_group = c_char.lower() in {'i', 'l', '1'} if r_group and c_group or r_char == c_char: current_match += 1 # 匹配数达到6个及以上则记录并退出循环 if current_match >= 6: match_count = current_match matched_plate = reg_plate break # 根据匹配结果执行对应操作 if matched_plate: match_percent = (match_count / 7) * 100 print(f"匹配率: {match_percent:.2f}%") print("达到最低要求,发送通行信号。") print("匹配的登记车牌:", matched_plate) # publish.single(...) # 此处添加通行信号发送逻辑 else: print("未达到最低匹配要求,请重新识别车牌。") # publish.single(...) # 此处添加拒绝通行逻辑
关键优化点
- 修复DataFrame遍历逻辑:使用
iterrows()正确遍历每一行数据 - 新增I/1/l混淆处理:将这三个易混淆字符视为等价匹配,解决OCR识别误差
- 完善字符匹配统计:逐字符对比并累计匹配数
- 增加车牌长度校验,过滤无效数据
- 修正百分比计算逻辑,确保结果准确
内容的提问来源于stack exchange,提问作者VicourtBitt
相关产品推荐
相关产品推荐

