每次查看数据详情都会弹出验证码,该验证码图片和目标字符都在下面接口返回。
image-20240112172148008.png (182.64 KB, 下载次数: 0)
下载附件
2024-1-13 10:30 上传
点选完之后会请求数据接口,观察入参ClickText疑似目标字符的坐标点
image-20240112173138355.png (23.79 KB, 下载次数: 0)
下载附件
2024-1-13 10:30 上传
Ctrl+Shift+F搜索一下ClickText找到该参数生成位置如下,简单分析了并验证了一下确为目标字符的中心点坐标。验证码本身比较简单,重点关注下怎么实现获取坐标点。
image-20240112174243284.png (43.77 KB, 下载次数: 0)
下载附件
2024-1-13 10:35 上传
二、实现方式分析
一顿搜完事发现ddddocr在1.3.0版本更新了目标检测功能,官方介绍如下:
image-20240112175219069.png (399.82 KB, 下载次数: 0)
下载附件
2024-1-13 10:36 上传
调用det.detection方法会返回所有文字的坐标集
image-20240112175446750.png (141.97 KB, 下载次数: 0)
下载附件
2024-1-13 10:37 上传
虽然有了所有文字的坐标集,但是我只需要三个目标字符的坐标 并且还要是有序的 怎么办?
我的思路是
[ol]
[/ol]
1、扣字 处理图片:
def splicing_strings(image_path: str, boxes: list) -> Image.Image:
"""
根据坐标集将所有字符处理后拼接为一张新的图片
:param image_path: 原图地址
:param boxes: 字符坐标集
:return:
"""
original_image = Image.open(image_path)
new_image = Image.new("RGB", (len(boxes) * 40, 40)) # 40是预设的每个字的宽度,高度
for idx, box in enumerate(boxes):
cropped_region = original_image.crop(box)
cropped_region = cropped_region.convert("L") # 转换为灰度
cropped_region = ImageOps.autocontrast(cropped_region) # 自动调整对比度
cropped_region = cropped_region.point(lambda x: 0 if x
执行完后得到效果如图:
image-20240112180423939.png (5.47 KB, 下载次数: 0)
下载附件
2024-1-13 10:37 上传
2、识别文字
ocr = ddddocr.DdddOcr(show_ad=False)
...
# 将splicing_strings的结果丢给ocr.classification
text = ocr.classification(image)
assert len(text) == len(boxes), '识别失败'
print(text)
得到结果:灰庚祸羡浪
3、根据目标文字去匹配该字符的坐标集
首先获取目标字符在text中的索引,然后在坐标集里面取该索引的坐标集 即为该目标字符的坐标集
for target in targets:
x1, y1, x2, y2 = boxes[text.index(target)]
4、计算中心坐标
points = []
for index, target in enumerate(targets):
assert target in text, '识别失败'
x1, y1, x2, y2 = boxes[text.index(target)]
center_point = (x2 - x1) // 2 + x1, (y2 - y1) // 2 + y1
points.append(f'{index + 1}:{center_point[0]},{center_point[1]}')
result = '-'.join(points)
最后整理下代码成功拿到数据
image-20240112230608943.png (24.21 KB, 下载次数: 0)
下载附件
2024-1-13 10:41 上传