python强大的通用验证码识别库ddddocr

带带弟弟ocr是一个python下强大的验证码识别库,能识别多种类型的验证码,有兴趣的朋友可以研究以下,GitHub地址:https://github.com/sml2h3/ddddocr

安装

环境支持:python<=3.9

pip install ddddocr

识别验证码

验证码图片:

python强大的通用验证码识别库ddddocr
python强大的通用验证码识别库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)
ocr识别效果
识别效果

执行后能正确识别出验证码,不过会输出3行作者预设的广告内容,如果不想输出这3行的话加个参数就可以

ocr = ddddocr.DdddOcr(old=True, show_ad=False)
ocr识别效果
识别效果

现在就不会输出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%左右。下面给几张能正确识别的图片你们测试。

python强大的通用验证码识别库ddddocr
python强大的通用验证码识别库ddddocr
python强大的通用验证码识别库ddddocr
python强大的通用验证码识别库ddddocr

原创文章,作者:小哆啦,如若转载,请注明出处:https://www.notevm.com/a/6048.html

(3)
小哆啦的头像小哆啦
上一篇 2022年6月4日 17:26
下一篇 2022年6月8日 11:49

相关推荐

发表回复

登录后才能评论

评论列表(1条)

  • 8150
    8150 2023年5月3日 21:35

    我的需求 正是你的例子 我是新手 连注释也看不太懂