MCPcopy
hub / github.com/sml2h3/ddddocr

github.com/sml2h3/ddddocr @main sqlite

repository ↗ · DeepWiki ↗
252 symbols 803 edges 32 files 174 documented · 69%
README

DdddOcr - 通用验证码识别SDK

DdddOcr Logo

一个简单易用的通用验证码识别Python库

目录

赞助合作商

赞助合作商 推荐理由
YesCaptcha YesCaptcha 谷歌reCaptcha验证码 / hCaptcha验证码 / funCaptcha验证码商业级识别接口 点我 直达VIP4
超级鹰 超级鹰 全球领先的智能图片分类及识别商家,安全、准确、高效、稳定、开放,强大的技术及校验团队,支持大并发。7*24h作业进度管理
Malenia Malenia Malenia企业级代理IP网关平台/代理IP分销软件
雨云VPS 注册首月5折 浙江节点低价大带宽,100M每月30元

项目介绍

DdddOcr 是一个通用验证码离线本地识别SDK,由 sml2h3kerlomz 共同开发完成。该项目通过大批量生成随机数据进行深度网络训练,可以识别各种类型的验证码,包括:

  • 常见的数字字母组合验证码
  • 中文验证码
  • 滑块验证码
  • 各种特殊字符验证码

项目设计理念是"最简依赖",尽量减少用户的配置和使用成本,提供简单易用的API接口。

环境支持

系统 CPU GPU 最大支持Python版本 备注
Windows 64位 3.12 部分版本Windows需要安装vc运行库
Linux 64 / ARM64 3.12
macOS X64 3.12 M1/M2/M3芯片用户请参考相关说明

不支持的环境: - Windows 32位 - Linux 32位

安装方法

从PyPI安装(推荐)

pip install ddddocr

从源码安装

git clone https://github.com/sml2h3/ddddocr.git
cd ddddocr
pip install .

安装 API 依赖(可选)

pip install ".[api]"

注意:请勿直接在ddddocr项目的根目录内直接import ddddocr,请确保你的开发项目目录名称不为ddddocr。

功能概览

DdddOcr提供以下核心功能:

功能 描述 初始化参数
文字识别 识别图片中的文字内容 ocr=True(默认)
目标检测 检测图片中的目标位置 det=True
滑块验证码识别 识别滑块验证码的缺口位置 ocr=False
自定义模型导入 导入自定义训练的模型 import_onnx_path="模型路径"

初始化参数详解

DdddOcr 类初始化时支持多种参数配置,以适应不同的使用场景:

ddddocr.DdddOcr(
    ocr=True,           # 是否启用OCR功能
    det=False,          # 是否启用目标检测功能
    old=False,          # 是否使用旧版OCR模型
    beta=False,         # 是否使用Beta版OCR模型(新模型)
    use_gpu=False,      # 是否使用GPU加速
    device_id=0,        # 使用的GPU设备ID
    show_ad=True,       # 是否显示广告信息
    import_onnx_path="", # 自定义模型路径
    charsets_path="",    # 自定义字符集路径
    max_image_bytes=None, # 单图最大字节数(默认 8MB)
    max_image_side=None   # 单图最长边限制(默认 4096px)
)

参数详细说明

参数 类型 默认值 说明
ocr bool True 是否启用OCR功能,用于识别图片中的文字。互斥性:当det=True时会强制关闭OCR
det bool False 是否启用目标检测功能,用于检测图片中的目标位置。互斥性det=True会覆盖ocr=True
old bool False 兼容参数,当前不会改变模型选择(默认即使用旧版模型)
beta bool False 是否使用Beta版OCR模型(新模型),对某些验证码识别效果更好。互斥性:与old=True参数互斥(但old当前不生效)
use_gpu bool False 是否使用GPU加速。依赖关系:需要安装CUDA和相应的onnxruntime-gpu版本,否则会初始化失败
device_id int 0 使用的GPU设备ID。依赖关系:仅在use_gpu=True时生效,指定使用哪个GPU设备
show_ad bool True 是否在初始化时显示广告信息
import_onnx_path str "" 自定义模型的onnx文件路径。依赖关系:设置此参数时,charsets_path参数必须同时提供;此时ocr/det设置会被忽略
charsets_path str "" 自定义字符集的json文件路径。依赖关系:必须与import_onnx_path一起使用,否则无效
max_image_bytes int/str 8MB 单图最大字节数上限(入参可为 int 或数字字符串)
max_image_side int/str 4096 单图最长边像素上限(入参可为 int 或数字字符串)

功能组合与冲突

根据参数组合,ddddocr具有不同的工作模式:

  1. 标准OCR模式
  2. 参数设置:ocr=True, det=False(默认)
  3. 功能:识别图片中的文字

  4. 目标检测模式

  5. 参数设置:ocr=False, det=True
  6. 功能:检测图片中的目标位置
  7. 注意:同时设置ocr=True, det=True时,会进入目标检测模式(det优先)

  8. 滑块识别模式

  9. 参数设置:ocr=False, det=False
  10. 功能:使用滑块匹配算法(需调用slide_matchslide_comparison方法)

  11. 自定义模型模式

  12. 参数设置:import_onnx_path="模型路径", charsets_path="字符集路径"
  13. 功能:使用自定义训练的模型进行识别
  14. 注意:设置此模式时,ocrdet参数会被忽略,且自定义字符集文件需包含 charset/word/image/channel 字段

  15. OCR模型选择

  16. 默认模型:不设置特殊参数(当前使用 common_old.onnx
  17. Beta模型:beta=True(使用 common.onnx
  18. 旧版模型参数:old=True(当前不改变模型,仅为兼容保留)
  19. 注意:betaold参数互斥,但old当前不生效

模型选择指南

  • 默认模型:当前默认使用 common_old.onnx,适用于多数简单验证码场景
  • Beta模型beta=True 使用 common.onnx,对部分复杂验证码效果更好
  • 自定义模型:当默认模型无法满足需求时,可以通过dddd_trainer训练自己的模型

性能优化参数

  • GPU加速:对于处理大量图片时,开启GPU加速可显著提升性能 python ocr = ddddocr.DdddOcr(use_gpu=True, device_id=0)

  • GPU设备选择:在多GPU环境中,可通过device_id指定使用的GPU python # 使用第二张GPU卡 ocr = ddddocr.DdddOcr(use_gpu=True, device_id=1)

  • 关闭广告显示:在生产环境中可关闭广告提示 python ocr = ddddocr.DdddOcr(show_ad=False)

详细使用说明

文字识别功能

基础OCR识别

主要用于识别单行文字,如常见的英数验证码等。支持中文、英文、数字以及部分特殊字符的识别。

import ddddocr

# 初始化OCR对象
ocr = ddddocr.DdddOcr()

# 读取图片
with open("验证码图片.jpg", "rb") as f:
    image = f.read()

# 识别图片
result = ocr.classification(image)
print(result)  # 输出识别结果

OCR识别示例图片

参考例图

包括且不限于以下图片

captcha captcha captcha captcha captcha captcha

captcha captcha captcha captcha captcha captcha

OCR模型选择

DdddOcr内置两套OCR模型,可以通过beta参数切换:

# 使用第二套OCR模型
ocr = ddddocr.DdddOcr(beta=True)

透明PNG图片处理

对于透明黑色PNG图片,可以使用png_fix参数(对所有 OCR 模式生效):

result = ocr.classification(image, png_fix=True)

注意png_fix 仅对带透明通道的图片生效;初始化DdddOcr对象只需要一次,不要在每次识别时都重新初始化,这会导致速度变慢。

OCR概率输出

可以获取OCR识别结果的概率分布,便于进行更灵活的结果处理:

import ddddocr

ocr = ddddocr.DdddOcr()
image = open("test.jpg", "rb").read()

# 获取识别结果的概率分布
result = ocr.classification(image, probability=True)

# 处理概率结果
s = ""
for i in result['probability']:
    s += result['charsets'][i.index(max(i))]

print(s)

概率输出示例(仅对内置模型生效,自定义模型会忽略probability=True并直接返回字符串):

# 概率输出结果示例
{
    'charsets': ['', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', ...],
    'probability': [
        [0.01, 0.02, 0.01, 0.03, 0.02, 0.01, 0.02, 0.75, 0.03, 0.05, 0.01, ...],  # 第一个字符的概率分布
        [0.01, 0.01, 0.02, 0.01, 0.03, 0.02, 0.01, 0.02, 0.01, 0.80, 0.01, ...],  # 第二个字符的概率分布
        ...
    ]
}

自定义字符范围

可以通过set_ranges方法限定OCR识别的字符范围:

import ddddocr

ocr = ddddocr.DdddOcr()
image = open("test.jpg", "rb").read()

# 设置识别范围为数字
ocr.set_ranges(0)  # 等同于 ocr.set_ranges("0123456789")

# 或自定义字符范围
ocr.set_ranges("0123456789+-x/=")

result = ocr.classification(image)
print(result)

内置字符范围参数

参数值 含义
0 纯数字 0-9
1 纯小写英文 a-z
2 纯大写英文 A-Z
3 小写英文 + 大写英文
4 小写英文 + 数字
5 大写英文 + 数字
6 小写英文 + 大写英文 + 数字
7 默认字符库 - 小写英文 - 大写英文 - 数字

颜色过滤功能

对于一些特殊的验证码,可以通过颜色过滤来提高识别准确率:

import ddddocr

ocr = ddddocr.DdddOcr()
image = open("test.jpg", "rb").read()

# 只保留红色和蓝色部分
result = ocr.classification(image, colors=["red", "blue"])
print(result)

支持的颜色: - red (红色) - green (绿色) - blue (蓝色) - yellow (黄色) - orange (橙色) - purple (紫色) - pink (粉色) - brown (棕色)

也可以自定义颜色范围:

# 自定义颜色范围
custom_ranges = {
    'light_blue': [(90, 30, 30), (110, 255, 255)]  # HSV颜色空间
}

result = ocr.classification(image, colors=["light_blue"], custom_color_ranges=custom_ranges)

提示custom_color_ranges 只有在 colors 列表包含对应键名时才会生效。

目标检测功能

用于检测图像中可能的目标主体位置,返回目标的边界框坐标:

import ddddocr
import cv2

# 初始化检测对象
det = ddddocr.DdddOcr(det=True, ocr=False)

# 读取图片
with open("test.jpg", 'rb') as f:
    image = f.read()

# 检测目标
bboxes = det.detection(image)
print(bboxes)  # 输出格式:[[x1, y1, x2, y2], ...]

# 可视化检测结果
im = cv2.imread("test.jpg")
for bbox in bboxes:
    x1, y1, x2, y2 = bbox
    im = cv2.rectangle(im, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)
cv2.imwrite("result.jpg", im)

目标检测示例

参考例图

包括且不限于以下图片

captcha captcha captcha captcha

captcha captcha captcha

滑块验证码处理

DdddOcr提供两种滑块验证码处理算法:

算法1:边缘匹配

适用于有透明背景的滑块图片,通过边缘检测找到滑块在背景图中的位置:

import ddddocr

# 初始化滑块检测对象
slide = ddddocr.DdddOcr(det=False, ocr=False)

# 读取滑块图和背景图
with open('target.png', 'rb') as f:
    target_bytes = f.read()

with open('background.png', 'rb') as f:
    background_bytes = f.read()

# 匹配位置
res = slide.slide_match(target_bytes, background_bytes)
print(f"滑块位置: {res}")

# 可视化结果
background = cv2.imdecode(np.frombuffer(background_bytes, np.uint8), cv2.IMREAD_COLOR)
x1, y1, x2, y2 = res["target"]

# 在背景图上绘制匹配位置
cv2.rectangle(background, (x1, y1), (x2, y2), (0, 255, 0), 2)

# 显示结果
plt.figure(figsize=(10, 6))
plt.imshow(cv2.cvtColor(background, cv2.COLOR_BGR2RGB))
plt.title("滑块匹配结果")
plt.axis('off')
plt.savefig("slide_result.jpg")
plt.show()

滑块匹配示例

滑块图 背景图

对于没有透明背景的滑块图,可以使用simple_target参数:

res = slide.slide_match(target_bytes, background_bytes, simple_target=True)

算法2:图像差异比较

适用于比较两张图片的不同之处,找出滑块缺口位置:

import ddddocr

slide = ddddocr.DdddOcr(det=False, ocr=False)

# 读取带有缺口阴影的图片和完整图片
with open('bg.jpg', 'rb') as f:
    target_bytes = f.read()

with open('fullpage.jpg', 'rb') as f:
    background_bytes = f.read()

# 比较差异
res = slide.slide_comparison(target_bytes, background_bytes)
print(res)  # 输出格式:{"target": [x, y]}

图像差异比较示例

带缺口阴影的图片 完整图片

自定义模型导入

DdddOcr支持导入通过dddd_trainer训练的自定义模型:

import ddddocr

# 导入自定义模型
ocr = ddddocr.DdddOcr(
    det=False, 
    ocr=False, 
    import_onnx_path="mymodel.onnx", 
    charsets_path="charsets.json"
)

with open('test.jpg', 'rb') as f:
    image_bytes = f.read()

res = ocr.classification(image_bytes)
print(res)

高级用法

批量处理

对大量验证码进行批量处理时,保持OCR实例的复用可以显著提高效率:

import ddddocr
import os
import time

# 初始化OCR对象(只需一次)
ocr = ddddocr.DdddOcr()

# 批量处理目录中的所有图片
def batch_process(directory):
    results = {}

    start_time = time.time()
    for filename in os.listdir(directory):
        if filename.endswith(('.png', '.jpg', '.jpeg', '.bmp')):
            file_path = os.path.join(directory, filename)

            with open(file_path, 'rb') as f:
                image = f.read()

            # 使用同一个OCR实例处理所有图片
            result = ocr.classification(image)
            results[filename] = result

    end_time = time.time()
    print(f"处理 {len(results)} 张图片耗时: {end_time - start_time:.2f} 秒")
    return results

# 使用示例
results = batch_process("./captchas/")
for filename, text in results.items():
    print(f"{filename}: {text}")

多线程优化

在多线程环境下使用时,应当为每个线程创建独立的OCR实例:

```python import ddddocr import concurrent.futures import os

def process_image(file_path): # 每个线程创建自己的OCR实例 ocr = ddddocr.DdddOcr()

with open(file_path, 'rb') as f:
    image = f.read()

result = ocr.classific

Core symbols most depended-on inside this repo

image_to_numpy
called by 9
ddddocr/utils/image_io.py
classification
called by 8
ddddocr/compat/v1.py
get_ocr_instance
called by 7
ddddocr/api/app.py
detection
called by 6
ddddocr/compat/v1.py
load_image_from_input
called by 6
ddddocr/utils/image_io.py
validate_image_input
called by 6
ddddocr/utils/validators.py
_decode_base64_bytes
called by 6
ddddocr/api/app.py
_update_valid_indices
called by 6
ddddocr/models/charset_manager.py

Shape

Method 122
Function 63
Class 44
Route 23

Languages

Python100%

Modules by API surface

ddddocr/api/app.py47 symbols
ddddocr/api/routes.py22 symbols
ddddocr/models/charset_manager.py20 symbols
ddddocr/api/models.py15 symbols
ddddocr/core/slide_engine.py13 symbols
ddddocr/core/ocr_engine.py13 symbols
ddddocr/compat/v1.py13 symbols
ddddocr/preprocessing/color_filter.py12 symbols
ddddocr/models/model_loader.py12 symbols
ddddocr/core/base.py11 symbols
ddddocr/utils/compat.py10 symbols
ddddocr/core/detection_engine.py10 symbols

Used by 2 indexed graphs manifest dependencies, hub-wide

Dependencies from manifests, versioned

Pillow8.0.0 · 1×
fastapi0.68.0 · 1×
numpy1.19.0 · 1×
onnxruntime1.8.0 · 1×
opencv-python4.5.0 · 1×
opencv-python-headless4.5.0 · 1×
pydantic1.8.0 · 1×
python-multipart0.0.5 · 1×
requests2.25.0 · 1×
uvicorn0.15.0 · 1×

For agents

$ claude mcp add ddddocr \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact