带带弟弟ocr是一个python下强大的验证码识别库,能识别多种类型的验证码,有兴趣的朋友可以研究以下,GitHub地址:https://github.com/sml2h3/ddddocr
安装
环境支持:python<=3.9
pip install ddddocr
识别验证码
验证码图片:


# coding=UTF-8
import ddddocr
ocr = ddddocr.DdddOcr(old=True)
with open('./1.png','rb') as f:
image = f.read()
res = ocr.classification(image)
print(res)

执行后能正确识别出验证码,不过会输出3行作者预设的广告内容,如果不想输出这3行的话加个参数就可以
ocr = ddddocr.DdddOcr(old=True, show_ad=False)

现在就不会输出3行广告了。
识别点选验证码
验证码网页上的样式

实际验证码图片:

代码:
# coding=UTF-8
import ddddocr
import cv2
img = cv2.imread('./d1.jpg')
det = ddddocr.DdddOcr(det=True, show_ad=False)
with open('./d1.jpg', 'rb') as f:
image = f.read()
poses = det.detection(image)
for box in poses:
# 对框内文字进行识别
x1, y1, x2, y2 = box
cv2.rectangle(img, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)
cv2.imwrite("./result.jpg", img)

可以看到程序能识别到图片中的文字并且圈出来,不过也仅仅是识别出图片中的文字,连同提示顺序的文字也包含进来,这并不是我们想要的效果。下面修改一下代码以达到识别出需要点击的顺序跟坐标。
# coding=UTF-8
import ddddocr
import cv2
import time
import re
import copy
start = time.perf_counter()
det = ddddocr.DdddOcr(det=True, show_ad=False)
ocr = ddddocr.DdddOcr(old=True, show_ad=False)
image = cv2.imread("d5.jpg")
order = image[344:384, 0:150] # 截取出文字顺序部分
cv2.imwrite('./order.jpg', order) # 保存文字顺序部分图片
_, order = cv2.imencode('.jpg', order)
strs = ocr.classification(order.tobytes()) # 识别文字
strs = re.sub("[a-zA-Z0-9]+", "", strs) # 过滤掉识别出来的英文、数字,增加准确率
new = copy.copy(image)
new[340:390, 0:400] = (0, 0, 0) # 遮挡住文字顺序部分
# new = cv2.cvtColor(new,cv2.COLOR_BGR2GRAY) #图片灰度处理
cv2.imwrite('./new.jpg', new) # 保存遮挡掉文字顺序部分后的图片
new = cv2.imencode('.jpg', new)[1]
poses = det.detection(new.tobytes())
strxys = {}
for box in poses:
# 对框内文字进行识别
x1, y1, x2, y2 = box
part = image[y1:y2, x1:x2]
img = cv2.imencode('.jpg', part)[1]
result = ocr.classification(img.tobytes())
result = re.sub("[a-zA-Z0-9]+", "", result)
if len(result) > 1:
result = result[0]
strxys[result] = [x1, y1, x2, y2]
print("请在下图依次点击:%s" % strs)
try:
for i in range(0, len(strs)):
x1, y1, x2, y2 = strxys[strs[i]]
image = cv2.rectangle(image, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)
cv2.putText(image, "%d" % (i + 1), (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) # 在图片上标注识别出来的顺序
print(i, strs[i], strxys[strs[i]])
cv2.imwrite("./result.jpg", image) # 保存标注了顺序的图片
except:
print("识别失败:%s" % strxys)
end = time.perf_counter()
print("执行时间:%s 秒" % (round(end - start, 3)))

截取处理过的图片:



现在就能正确识别出需要点选的顺序以及位置坐标,但是这不是100%能正确识别出来的,我测试了下准确率有50%左右。下面给几张能正确识别的图片你们测试。




原创文章,作者:小哆啦,如若转载,请注明出处:https://www.notevm.com/a/6048.html
评论列表(1条)
我的需求 正是你的例子 我是新手 连注释也看不太懂