我也是用的百度的 ocr-kie 。kie 可以将识别出的文本分类,例如:
{'NAME_KEY': [], 'NAME_VALUE': ['姓名张三'], 'SEX_KEY': ['性别男民族汉'], 'SEX_VALUE': [], 'NATION_KEY': [], 'NATION_VALUE': []}
唯一需要排序的场景是地址的提取,因为地址可能会换行。
我的办法是通过对比地址和证件号码的位置关系,确定照片的角度是哪一种,然后再依据每种角度来排序
0°:左上角 Y 点从小到大
90°:左上角 X 点从大到小
180°:左上角 Y 点从大到小
270°:左上角 X 点从小到大
# points 结构为 [[左上角 X, 左上角 Y], [右上角 X, 右上角 Y], [右下角 X, 右下角 Y], [左下角 X, 左下角 Y]]
# X 从左至右增大,Y 从上至下增大
# 计算地址文本块水平宽度 右上角 X - 左上角 X
x_length = address_points[1][0] - address_points[0][0]
# 计算地址文本块垂直高度 左下角 Y - 左上角 Y
y_length = address_points[3][1] - address_points[0][1]
# 判断图片是否水平
# 若地址文本块水平宽度大于垂直高度则说明图片处于 0°或 180°,否则处于 90°或 270°
is_horizontal = x_length > y_length
# 判断图片是否反转
# 若水平且地址文本块左上角 Y 点大于证件号码文本块左上角 Y 点 (即地址位于号码下方)则处于 180°
# 若非水平且地址文本块左上角 X 点大于证件号码文本块左上角 X 点 (即地址位于号码右侧),则处于 90°
is_reverse = (is_horizontal and address_points[0][1] >= number_points[0][1]) or \
(not is_horizontal and address_points[0][0] >= number_points[0][0])
# 执行排序
sorted_address_data = sorted(
address_data, reverse=is_reverse,
key=lambda x: x['points'][0][1 if is_horizontal else 0],
)