事件回顾:
近期班里组织了一个跑团,使用的是keep跑团助手(小程序) 。每个人都有一个昵称,要对“每日跑量”进行统计,以明确到底有哪些人跑了步,哪些人没跑步 。
为了解决这个问题,从3月28日(晚)到4月2日(早),共历时4天半,期间诞生了很多思路,学习了很多知识,下面 一 一 分享复盘一下 。
思路三,初识逆向 四,五,后记
一,抓包获取api
在网上主流的有两种,一种是,一种是,经过一天的研究我选择了 。
微信小程序抓包(详解)
但是抓包得到的结果却不尽人意,很明显,抓到的报文都是经过动态加密的 。尝试根据抓包得到的url构造api也失败了,要么是404,要么是error 。
最终还是放弃了抓包的思路,不过,至少会使用了,不是吗?
二,图片识别
随着跑团第一次活动的开展,每周要统计两次参与人员,那时是第一周的周二,我迎来了第一个挑战——当时我通过图片识别昵称,然后匹配字典来解决 。
想法很美好,显示很骨感 。
备注:一定要关闭vpn在运行代码 。
自动识别图片文字—保姆级OCR实战教程
【py征途4之无效思路】通过这段教程,我学习到了cnocr和两个图片文字识别库 。使用cnocr的过程不是很愉悦,因为,它不支持长图识别,并且上下行文字之间不能有较大的留白,基本识别不出内容 。
2百度api
本着什么简单,什么上的想法,我去注册了个百度api的账号 。
调用百度ocr接口,实现图片内文字识别
根据这个教程我创建了应用,经过测试,不得不说,体验很一般(暗人不说明话),识别结果一团糟,即:“有,但是不准确” 。
最终还是选择了 。
分两步:
1 pip
2 -OCR的安装和使用
使用它,我坎坷的完成了这次挑战,但期间仍然出现了很多非预期,下面是个例子,以及我当时的解决思路 。
文章插图
# str1="小姜鸡39"# str2="小辣圾39"def like_standard(str1, str2):like_value = http://www.kingceram.com/post/0if len(str1) == len(str2):#如果长度相等,相似值加1like_value += 1for i in range(len(str1)):if str1[i:i+3] in str2:#三个字符三个字符增加相似值like_value += 1if like_value>= 2:#相似值至少大于3return Trueelse:return False
尝试使用相似值来“归纳”识别结果,但最终统计出来的数据会出现1-2个bug,无论怎么修正相似值任然会出现各种各样的非预期 。
4图片分割
为了提高识别的精准度,我还是去学习了cv2的图片分割方法,这个代码是我让写的,然后我只是修改了他写错的地方 。
import cv2img = cv2.imread('C:\\Users\\qte\\Desktop\\Screenshot_20230331_215023.jpg')# 指定图像路径并读取图像img_height = img.shape[0]# 获取图像的高度 。shape[0]是高度,shape[1]是宽度#segment_size = 150#确定分割的大小,以像素为单位,例如每150像素分割一次:segment_size=1180#这个像素似乎不会出现将一个名字分到两张图片print(segment_size)count = 1for i in range(0,img_height,segment_size):print(i)segment = img[i:i+segment_size,:]cv2.imwrite(f'C:\\Users\\qte\\Desktop\\123\\segment{count}.jpg', segment)count += 1
在这个过程中我还解决了后续识别和分类的代码,以下这段代码将统计哪些人跑了,哪些人没跑 。
class_all = [...]#这个列表记录了同学的信息class_name = {...:...}#这个字典记录了昵称的对应关系list_paole = []for i in text1:#print(i)# 输出识别结果for k in class_name.keys():if i.upper() == k.upper() or like_standard(i.upper(),k.upper()):#精准匹配+自写函数模糊匹配#print(like_standard(i,k))print(k)# 输出匹配上的识别结果if class_name[k] == "1":print(i)list_paole.append(i)else:print(class_name[k])list_paole.append(class_name[k])print(list_paole)re_class = [x for x in class_all if x not in list_paole]print(re_class)# list1 = [1,2,3,4]# list2 = [3,4,5,6]# list3 = [x for x in list1 if x not in list2]print(list3)#[1,2]# list1中的1和2都不在list2中,而3和4则在list2中,所以执行list 减法后,生成的list3中只包含list1中不在list2中的1和2
- 真实的郭靖与蒙古大*西征之谜:真实的郭靖并非风光八面
- 艺妓杨翠喜和袁世凯之间有什么特殊关系吗?
- 瞧,艺术的种子在孩子们心里发芽啦 中国之最幼儿艺术
- 我国最大年代最久铁佛!高3米,重5吨,铸于隋末唐初,全国少见! 罕见的中国之最
- 字工场分享:楼顶外墙立体字做哪种工艺比较好? 中国之最立体字
- 历届之最!他们让佘山半马更安全更有序 松江中国之最
- 《中国国家地理》评为中国最美的地方!年均温17℃,最佳避暑地! 小学地理中国之最
- 祖国领土寸土不让,我国国防部重磅发声,菲律宾切勿给脸不要脸 中国之最有多长
- 中国早餐之王,它排第二,没谁敢排第一 中国之最吃货
- 中国最长的河流之一,被誉为“中华民族的母亲河” 中国之最歌曲曲