一、如何识别购物小票
1.首先通过AI识别,将购物小票上的商品进行识别,之后再进行小票识别
2.采用OCR识别小票上的文字,输出对应的文字和坐标
3.将识别的文字和坐标一对一进行组合 for b_, c_ in zip(det_box, recs),并按照纵坐标的大小进行排列(坐标至关重要)
4.根据小票的格式进行识别模型的创建,将小票上的每一种商品的“货号”、“商品名称”、“数量”、“价格”都识别出来,最终形成每条信息对应一种商品的形式
5.将小票识别出的每一条商品信息与之前AI拍照的识别进行进行匹配,如果匹配上就能关联起来
二、小票识别的知识点总结
1.已知4个点的坐标,求中心点的纵坐标
box_center = list(np.mean(np.array(box_[0], dtype=int), axis=0))
axis=0表示对数组的列(纵坐标)进行运算
2.python中的isdigit()函数
用于判断一个字符串是否只由数字组成,如果字符串中的所有字符都是数字,返回True,否则返回False
char_info="130800400180"
str(char_info).isdigit() = True
3.re.compile(r'¥?[0-9]+\.[0-9]{0,2}')
在Python中,re.compile() 函数用于编译一个正则表达式模式,返回一个模式对象。
综合来看,这个正则表达式用于匹配可选的人民币符号,后面跟着至少一个数字,然后是一个点号,最后是0到2个数字。这种模式通常用于匹配货币数额,尤其是小数点后最多两位的数额,例如价格或费用。
例如:
¥123.45 将会匹配
99.9 也将会匹配
123. 不会匹配,因为至少需要小数点后跟着一个数字
¥.50 不会匹配,因为需要至少一个数字在小数点前面
4.re.findall(num_point, str_char)
在Python中,re.findall(pattern, string) 函数是 re(正则表达式)模块中的一个函数,用于在字符串中查找所有与正则表达式模式匹配的非重叠匹配项,并返回一个包含这些匹配项的列表。
import re
# 正则表达式模式,匹配任何数字
num_point = r'\d+'
# 要搜索的字符串
str_char = 'There are 123 apples and 456 oranges.'
# 使用 re.findall 查找所有数字
matches = re.findall(num_point, str_char)
print(matches) # 输出: ['123', '456']
在这个例子中,正则表达式模式 \d+ 表示匹配一个或多个数字字符。re.findall 函数找到了所有匹配的数字并返回了一个包含这些数字的列表。
如果你提供的 num_point 变量不是一个有效的正则表达式模式,或者 str_char 不是一个字符串,那么 re.findall 函数将无法正常工作,并可能抛出一个异常。确保 num_point 是一个正确的正则表达式模式,且 str_char 是你想要搜索的字符串。
5.matcher = difflib.SequenceMatcher(None, ticket_name, gname)
ython的difflib库中的SequenceMatcher类的使用。difflib库是Python标准库中的一个模块,它提供了一些方法来比较序列的相似性。
SequenceMatcher是difflib库中的一个类,它可以接受两个序列(在这个例子中是字符串ticket_name和gname),并计算两个序列之间的相似度。
创建一个SequenceMatcher对象,该对象会比较ticket_name和gname两个字符串的相似度。None参数表示在比较时不使用任何过滤函数。
6.similarity[0, j] = matcher.ratio()
matcher.ratio():返回两个序列的相似度,结果是一个介于0(完全不相似)和1(完全相同)之间的浮点数。
7.num_index.sort(key=lambda x: y_cors[x], reverse=False)
这是一个排序操作,根据列表num_index中的元素在y_cors字典中对应的值进行排序,排序方式是升序(reverse=False)。