{"id":13459216,"url":"https://github.com/sml2h3/ddddocr","last_synced_at":"2025-05-12T13:33:06.566Z","repository":{"id":37258469,"uuid":"385876627","full_name":"sml2h3/ddddocr","owner":"sml2h3","description":"带带弟弟 通用验证码识别OCR pypi版","archived":false,"fork":false,"pushed_at":"2024-12-30T07:28:39.000Z","size":74753,"stargazers_count":11612,"open_issues_count":94,"forks_count":1965,"subscribers_count":89,"default_branch":"master","last_synced_at":"2025-04-30T07:44:16.750Z","etag":null,"topics":["captcha","ddddocr","ocr"],"latest_commit_sha":null,"homepage":"https://ddddocr.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sml2h3.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-07-14T09:00:06.000Z","updated_at":"2025-04-30T05:57:05.000Z","dependencies_parsed_at":"2025-04-23T07:15:34.271Z","dependency_job_id":null,"html_url":"https://github.com/sml2h3/ddddocr","commit_stats":{"total_commits":56,"total_committers":5,"mean_commits":11.2,"dds":0.1785714285714286,"last_synced_commit":"22c64608641c3a536ea50a4123e824707a159bc6"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sml2h3%2Fddddocr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sml2h3%2Fddddocr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sml2h3%2Fddddocr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sml2h3%2Fddddocr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sml2h3","download_url":"https://codeload.github.com/sml2h3/ddddocr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253748163,"owners_count":21957874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["captcha","ddddocr","ocr"],"created_at":"2024-07-31T09:01:10.645Z","updated_at":"2025-05-12T13:33:06.502Z","avatar_url":"https://github.com/sml2h3.png","language":"Python","funding_links":[],"categories":["Python","光学字符识别OCR","AI应用"],"sub_categories":["资源传输下载"],"readme":"\n\n# DdddOcr 带带弟弟OCR通用验证码离线本地识别SDK免费开源版\n\nDdddOcr，其由 [本作者](https://github.com/sml2h3) 与 [kerlomz](https://github.com/kerlomz) 共同合作完成，通过大批量生成随机数据后进行深度网络训练，本身并非针对任何一家验证码厂商而制作，本库使用效果完全靠玄学，可能可以识别，可能不能识别。\n\nDdddOcr、最简依赖的理念，尽量减少用户的配置和使用成本，希望给每一位测试者带来舒适的体验\n\n项目地址： [点我传送](https://github.com/sml2h3/ddddocr) \n\n\u003c!-- PROJECT SHIELDS --\u003e\n\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![MIT License][license-shield]][license-url]\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/sml2h3/ddddocr/\"\u003e\n    \u003cimg src=\"https://cdn.wenanzhe.com/img/logo.png!/crop/700x500a400a500\" alt=\"Logo\"\u003e\n  \u003c/a\u003e\n  \u003cp align=\"center\"\u003e\n    一个容易使用的通用验证码识别python库\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/sml2h3/ddddocr/\"\u003e\u003cstrong\u003e探索本项目的文档 »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    ·\n    \u003ca href=\"https://github.com/sml2h3/ddddocr/issues\"\u003e报告Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/sml2h3/ddddocr/issues\"\u003e提出新特性\u003c/a\u003e\n  \u003c/p\u003e\n\n\u003c/p\u003e\n\n \n## 目录\n\n- [赞助合作商](#赞助合作商)\n- [上手指南](#上手指南)\n  - [环境支持](#环境支持)\n  - [安装步骤](#安装步骤)\n- [文件目录说明](#文件目录说明)\n- [项目底层支持](#项目底层支持)\n- [使用文档](#使用文档)\n  - [基础ocr识别能力](#i-基础ocr识别能力)\n  - [目标检测能力](#ii-目标检测能力)\n  - [滑块检测](#ⅲ-滑块检测)\n  - [OCR概率输出](#ⅳ-ocr概率输出)\n  - [自定义OCR训练模型导入](#ⅴ-自定义ocr训练模型导入)\n- [版本控制](#版本控制)\n- [相关推荐文章or项目](#相关推荐文章or项目)\n- [作者](#作者)\n- [捐赠](#捐赠)\n- [Star历史](#Star历史)\n\n\n\n### 赞助合作商\n\n|                                                            | 赞助合作商 | 推荐理由                                                                                             |\n|------------------------------------------------------------|------------|--------------------------------------------------------------------------------------------------|\n| ![YesCaptcha](https://cdn.wenanzhe.com/img/yescaptcha.png) | [YesCaptcha](https://yescaptcha.com/i/NSwk7i) | 谷歌reCaptcha验证码 / hCaptcha验证码 / funCaptcha验证码商业级识别接口 [点我](https://yescaptcha.com/i/NSwk7i) 直达VIP4 |\n| ![超级鹰](https://cdn.wenanzhe.com/img/logo.gif) | [超级鹰](https://www.chaojiying.com/) | 全球领先的智能图片分类及识别商家，安全、准确、高效、稳定、开放，强大的技术及校验团队，支持大并发。7*24h作业进度管理 |\n| ![Malenia](https://cdn.wenanzhe.com/img/malenia.png!/scale/50)    | [Malenia](https://malenia.iinti.cn/malenia-doc/) | Malenia企业级代理IP网关平台/代理IP分销软件 |\n| 雨云VPS    | [注册首月5折](https://www.rainyun.com/ddddocr_) | 浙江节点低价大带宽，100M每月30元 |\n\n\n### 上手指南\n\n###### 环境支持\n\n\n\n| 系统               | CPU | GPU | 最大支持py版本 | 备注                                                                 |\n|------------------|-----|------|----------|--------------------------------------------------------------------|\n| Windows 64位      | √   | √ | 3.12     | 部分版本windows需要安装\u003ca href=\"https://www.ghxi.com/yxkhj.html\"\u003evc运行库\u003c/a\u003e |\n| Windows 32位      | ×   | × | -        |                                                                    |\n| Linux 64 / ARM64 | √   | √ | 3.12     |                                                                    |\n| Linux 32         | ×   | × | -        |                                                                    |\n| Macos  X64       | √   | √ | 3.12     | M1/M2/M3...芯片参考\u003ca href=\"https://github.com/sml2h3/ddddocr/issues/67\"\u003e#67\u003c/a\u003e         |\n\n###### **安装步骤**\n\n**i. 从pypi安装** \n```sh\npip install ddddocr\n```\n\n**ii. 从源码安装**\n```sh\ngit clone https://github.com/sml2h3/ddddocr.git\ncd ddddocr\npython setup.py\n```\n\n**请勿直接在ddddocr项目的根目录内直接import ddddocr**，请确保你的开发项目目录名称不为ddddocr，此为基础常识。\n\n### 文件目录说明\neg:\n\n```\nddddocr \n├── MANIFEST.in\n├── LICENSE\n├── README.md\n├── /ddddocr/\n│  │── __init__.py            主代码库文件\n│  │── common.onnx            新ocr模型\n│  │── common_det.onnx        目标检测模型\n│  │── common_old.onnx        老ocr模型\n│  │── logo.png\n│  │── README.md\n│  │── requirements.txt\n├── logo.png\n└── setup.py\n\n```\n\n### 项目底层支持 \n\n本项目基于[dddd_trainer](https://github.com/sml2h3/dddd_trainer) 训练所得，训练底层框架位pytorch，ddddocr推理底层抵赖于[onnxruntime](https://pypi.org/project/onnxruntime/)，故本项目的最大兼容性与python版本支持主要取决于[onnxruntime](https://pypi.org/project/onnxruntime/)。\n\n### 使用文档\n\n##### i. 基础ocr识别能力\n\n主要用于识别单行文字，即文字部分占据图片的主体部分，例如常见的英数验证码等，本项目可以对中文、英文（随机大小写or通过设置结果范围圈定大小写）、数字以及部分特殊字符。\n\n```python\n# example.py\nimport ddddocr\n\nocr = ddddocr.DdddOcr()\n\nimage = open(\"example.jpg\", \"rb\").read()\nresult = ocr.classification(image)\nprint(result)\n```\n\n本库内置有两套ocr模型，默认情况下不会自动切换，需要在初始化ddddocr的时候通过参数进行切换\n\n```python\n# example.py\nimport ddddocr\n\nocr = ddddocr.DdddOcr(beta=True)  # 切换为第二套ocr模型\n\nimage = open(\"example.jpg\", \"rb\").read()\nresult = ocr.classification(image)\nprint(result)\n```\n\n**提示**\n对于部分透明黑色png格式图片得识别支持: `classification` 方法 使用 `png_fix` 参数，默认为False\n\n```python\n ocr.classification(image, png_fix=True)\n```\n\n**注意**\n\n之前发现很多人喜欢在每次ocr识别的时候都重新初始化ddddocr，即每次都执行```ocr = ddddocr.DdddOcr()```，这是错误的，通常来说只需要初始化一次即可，因为每次初始化和初始化后的第一次识别速度都非常慢\n\n\n**参考例图**\n\n包括且不限于以下图片\n\n\u003cimg src=\"https://cdn.wenanzhe.com/img/20210715211733855.png\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/78b7f57d-371d-4b65-afb2-d19608ae1892.png\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20211226142305.png\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20211226142325.png\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/2AMLyA_fd83e1f1800e829033417ae6dd0e0ae0.png\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/aabd_181ae81dd5526b8b89f987d1179266ce.jpg\" alt=\"captcha\" width=\"150\"\u003e\n\u003cbr /\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/2bghz_b504e9f9de1ed7070102d21c6481e0cf.png\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/0000_z4ecc2p65rxc610x.jpg\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/2acd_0586b6b36858a4e8a9939db8a7ec07b7.jpg\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/2a8r_79074e311d573d31e1630978fe04b990.jpg\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/aftf_C2vHZlk8540y3qAmCM.bmp\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20211226144057.png\" alt=\"captcha\" width=\"150\"\u003e\n\n##### ii. 目标检测能力\n\n主要用于快速检测出图像中可能的目标主体位置，由于被检测出的目标不一定为文字，所以本功能仅提供目标的bbox位置 **（在⽬标检测⾥，我们通常使⽤bbox（bounding box，缩写是 bbox）来描述⽬标位置。bbox是⼀个矩形框，可以由矩形左上⻆的 x 和 y 轴坐标与右下⻆的 x 和 y 轴坐标确定）** \n\n如果使用过程中无需调用ocr功能，可以在初始化时通过传参`ocr=False`关闭ocr功能，开启目标检测需要传入参数`det=True`\n\n```python\nimport ddddocr\nimport cv2\n\ndet = ddddocr.DdddOcr(det=True)\n\nwith open(\"test.jpg\", 'rb') as f:\n    image = f.read()\n\nbboxes = det.detection(image)\nprint(bboxes)\n\nim = cv2.imread(\"test.jpg\")\n\nfor bbox in bboxes:\n    x1, y1, x2, y2 = bbox\n    im = cv2.rectangle(im, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)\n\ncv2.imwrite(\"result.jpg\", im)\n\n```\n\n\n\n**参考例图**\n\n包括且不限于以下图片\n\n\u003cimg src=\"https://cdn.wenanzhe.com/img/page1_1.jpg\" alt=\"captcha\" width=\"200\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/page1_2.jpg\" alt=\"captcha\" width=\"200\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/page1_3.jpg\" alt=\"captcha\" width=\"200\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/page1_4.jpg\" alt=\"captcha\" width=\"200\"\u003e\n\u003cbr /\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/result.jpg\" alt=\"captcha\" width=\"200\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/result2.jpg\" alt=\"captcha\" width=\"200\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/result4.jpg\" alt=\"captcha\" width=\"200\"\u003e\n\n##### Ⅲ. 滑块检测\n\n本项目的滑块检测功能并非AI识别实现，均为opencv内置算法实现。可能对于截图党用户没那么友好~，如果使用过程中无需调用ocr功能或目标检测功能，可以在初始化时通过传参`ocr=False`关闭ocr功能或`det=False`来关闭目标检测功能\n\n本功能内置两套算法实现，适用于两种不同情况，具体请参考以下说明\n\n**a.算法1**\n\n算法1原理是通过滑块图像的边缘在背景图中计算找到相对应的坑位，可以分别获取到滑块图和背景图，滑块图为透明背景图\n\n滑块图\n\n\u003cimg src=\"https://cdn.wenanzhe.com/img/b.png\" alt=\"captcha\" width=\"50\"\u003e\n\n背景图\n\n\u003cimg src=\"https://cdn.wenanzhe.com/img/a.png\" alt=\"captcha\" width=\"350\"\u003e\n\n```python\n    det = ddddocr.DdddOcr(det=False, ocr=False)\n    \n    with open('target.png', 'rb') as f:\n        target_bytes = f.read()\n    \n    with open('background.png', 'rb') as f:\n        background_bytes = f.read()\n    \n    res = det.slide_match(target_bytes, background_bytes)\n    \n    print(res)\n  ```\n  由于滑块图可能存在透明边框的问题，导致计算结果不一定准确，需要自行估算滑块图透明边框的宽度用于修正得出的bbox\n\n  *提示：如果滑块无过多背景部分，则可以添加simple_target参数， 通常为jpg或者bmp格式的图片*\n\n```python\n    slide = ddddocr.DdddOcr(det=False, ocr=False)\n    \n    with open('target.jpg', 'rb') as f:\n        target_bytes = f.read()\n    \n    with open('background.jpg', 'rb') as f:\n        background_bytes = f.read()\n    \n    res = slide.slide_match(target_bytes, background_bytes, simple_target=True)\n    \n    print(res)\n  ```\n\n**a.算法2**\n\n算法2是通过比较两张图的不同之处进行判断滑块目标坑位的位置\n\n参考图a，带有目标坑位阴影的全图\n\n\u003cimg src=\"https://cdn.wenanzhe.com/img/bg.jpg\" alt=\"captcha\" width=\"350\"\u003e\n\n参考图b，全图\n\n\u003cimg src=\"https://cdn.wenanzhe.com/img/fullpage.jpg\" alt=\"captcha\" width=\"350\"\u003e\n\n```python\n    slide = ddddocr.DdddOcr(det=False, ocr=False)\n\n    with open('bg.jpg', 'rb') as f:\n        target_bytes = f.read()\n    \n    with open('fullpage.jpg', 'rb') as f:\n        background_bytes = f.read()\n    \n    img = cv2.imread(\"bg.jpg\")\n    \n    res = slide.slide_comparison(target_bytes, background_bytes)\n\n    print(res)\n  ```\n\n##### Ⅳ. OCR概率输出\n\n为了提供更灵活的ocr结果控制与范围限定，项目支持对ocr结果进行范围限定。\n\n可以通过在调用`classification`方法的时候传参`probability=True`，此时`classification`方法将返回全字符表的概率\n当然也可以通过`set_ranges`方法设置输出字符范围来限定返回的结果。\n\nⅠ. `set_ranges` 方法限定返回字符返回\n\n本方法接受1个参数，如果输入为int类型为内置的字符集限制，string类型则为自定义的字符集\n\n如果为int类型，请参考下表\n\n| 参数值 | 意义                                |\n|-----|-----------------------------------|\n| 0   | 纯整数0-9                            |\n| 1   | 纯小写英文a-z                          |\n| 2   | 纯大写英文A-Z                          |\n| 3   | 小写英文a-z + 大写英文A-Z                 |\n| 4   | 小写英文a-z + 整数0-9                   |\n| 5   | 大写英文A-Z + 整数0-9                   |\n| 6   | 小写英文a-z + 大写英文A-Z + 整数0-9         |\n| 7   | 默认字符库 - 小写英文a-z - 大写英文A-Z - 整数0-9 |\n\n如果为string类型请传入一段不包含空格的文本，其中的每个字符均为一个待选词\n如：`\"0123456789+-x/=\"\"`\n\n```python\nimport ddddocr\n\nocr = ddddocr.DdddOcr()\n\nimage = open(\"test.jpg\", \"rb\").read()\nocr.set_ranges(\"0123456789+-x/=\")\nresult = ocr.classification(image, probability=True)\ns = \"\"\nfor i in result['probability']:\n    s += result['charsets'][i.index(max(i))]\n\nprint(s)\n\n```\n\n##### Ⅴ. 自定义OCR训练模型导入\n\n本项目支持导入来自于 [dddd_trainer](https://github.com/sml2h3/dddd_trainer) 进行自定义训练后的模型，参考导入代码为\n\n```python\nimport ddddocr\n\nocr = ddddocr.DdddOcr(det=False, ocr=False, import_onnx_path=\"myproject_0.984375_139_13000_2022-02-26-15-34-13.onnx\", charsets_path=\"charsets.json\")\n\nwith open('test.jpg', 'rb') as f:\n    image_bytes = f.read()\n\nres = ocr.classification(image_bytes)\nprint(res)\n\n```\n\n### 版本控制\n\n该项目使用Git进行版本管理。您可以在repository参看当前可用版本。\n\n### 相关推荐文章or项目\n\n[带带弟弟OCR，纯VBA本地获取网络验证码整体解决方案](https://club.excelhome.net/thread-1666823-1-1.html)\n\n[ddddocr nodejs 版本](https://github.com/rhy3h/ddddocr-node)\n\n[ddddocr rust 版本](https://github.com/86maid/ddddocr)\n\n[captcha-killer的修改版](https://github.com/f0ng/captcha-killer-modified)\n\n[通过ddddocr训练字母数字验证码模型并识别部署调用](https://www.bilibili.com/video/BV1ez421C7dB)\n\n...\n\n欢迎更多优秀案例或教程等进行投稿，可直接新建issue标题以【投稿】开头，附上公开教程站点链接，我会选择根据文章内容选择相对不重复或者有重点内容等进行readme展示，感谢各位朋友~\n\n### 作者\n\nsml2h3@gamil.com\n \n\u003cimg src=\"https://cdn.wenanzhe.com/img/mmqrcode1640418911274.png!/scale/50\" alt=\"wechat\" width=\"150\"\u003e\n\n *好友数过多不一定通过，有问题可以在issue进行交流*\n\n### 版权说明\n\n该项目签署了MIT 授权许可，详情请参阅 [LICENSE](https://github.com/sml2h3/ddddocr/blob/master/LICENSE)\n\n### 捐赠 （如果项目有帮助到您，可以选择捐赠一些费用用于ddddocr的后续版本维护，本项目长期维护）\n\n\u003cimg src=\"https://cdn.wenanzhe.com/img/zhifubao.jpg\" alt=\"captcha\" width=\"150\"\u003e\n\u003cimg src=\"https://cdn.wenanzhe.com/img/weixin.jpg\" alt=\"captcha\" width=\"150\"\u003e\n\n\n\u003c!-- links --\u003e\n[your-project-path]:sml2h3/ddddocr\n[contributors-shield]: https://img.shields.io/github/contributors/sml2h3/ddddocr?style=flat-square\n[contributors-url]: https://github.com/shaojintian/Best_README_template/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/sml2h3/ddddocr?style=flat-square\n[forks-url]: https://github.com/shaojintian/Best_README_template/network/members\n[stars-shield]: https://img.shields.io/github/stars/sml2h3/ddddocr?style=flat-square\n[stars-url]: https://github.com/shaojintian/Best_README_template/stargazers\n[issues-shield]: https://img.shields.io/github/issues/sml2h3/ddddocr?style=flat-square\n[issues-url]: https://img.shields.io/github/issues/sml2h3/ddddocr.svg\n[license-shield]: https://img.shields.io/github/license/sml2h3/ddddocr?style=flat-square\n[license-url]: https://github.com/sml2h3/ddddocr/blob/master/LICENSE\n\n\n### Star 历史\n\n[![Star History Chart](https://api.star-history.com/svg?repos=sml2h3/ddddocr\u0026type=Date)](https://star-history.com/#sml2h3/ddddocr\u0026Date)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsml2h3%2Fddddocr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsml2h3%2Fddddocr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsml2h3%2Fddddocr/lists"}