generate any type of captcha with one config. 一套配置,一行代码,快速生成任意风格验证码。
通过简单的配置,可以快速生成大部分类型的验证码,旨在解决机器学习训练样本难以获取的问题,几乎可以0成本获取样本。 同时易于保存和修改,便于多次测试寻求最佳训练样本参数。更可以获取字符在验证码中的位置信息,适用于定位方面的项目。 温馨提示:搭配以下在线工具使用效率更佳:
any-captcha
configs: 存放配置文件
model: 项目源码
output: 默认验证码保存目录
resourcesbackground: 默认背景图片目录
corpus: 默认字符文本目录
font: 默认字体目录
markdown: md需要的资源
-
texts
: 字符串数组,验证码上可显示的所有字符的集合,如果:- 数组长度大于1,每个元素能且只能是普通字符串(非文件和文件夹路径),且每个元素作为整体随机的显示在验证码中,
此时
num
参数失效,每张验证码的字符个数由当前元素长度决定; - 数组长度等于1,此元素可以是:
- 文件路径:将文件中的每一行作为一个元素存储到数组中,然后按照1.处理;
- 普通字符串:则随机选取
num
个字符显示在每个验证码中。
*注:暂不支持文件夹路径。
- 数组长度大于1,每个元素能且只能是普通字符串(非文件和文件夹路径),且每个元素作为整体随机的显示在验证码中,
此时
-
fonts
: 字符串数组,验证码字体文件(.ttf或.ttc,不区分大小写)路径的集合,如果:- 数组长度大于1,每个元素能且只能是字体文件的路径;
- 数组长度等于1,此元素可以是单个字体文件的路径,或者存放字体的文件夹路径。
-
sizes
: 整型数组,验证码中字号大小的集合。 -
bgs
: 字符串数组,验证码的背景图片或者颜色的集合,如果:- 数组长度大于1,每个元素可以是
【单张背景图片路径,单个背景颜色(格式同
中的一个;colors
参数)】 - 数组长度等于1,此元素可以是
【单张背景图片路径,单个背景颜色,存放多张背景图片的文件夹路径, 存放多个背景颜色值的txt文件路径(每行一个颜色值)】
中的一个;
- 数组长度大于1,每个元素可以是
-
rotate
: 整型,验证码中单个字符可旋转角度的值,旋转角度的范围[-rotate
,rotate
],每次随机取值。 -
num
: 整型, 验证码显示的字符个数,具体参见texts
参数。 -
dot
: 整型,验证码中随机噪点的个数,默认(0)不显示噪点,如果有特定噪点需求, 推荐使用CaptchaFactory
中的bg_custom_fns
参数自定义。 -
curve
: 整型,验证码中随机干扰线的个数,默认(0)不显示干扰线,如有特殊需求同dot
。 -
width
: 整型,验证码的宽度。 -
height
: 整型,验证码的高度。 -
align
: 整型,验证码的对齐方式,取值1或2, 其中1为左对齐,2为两端对齐。 -
offset_ver
: 整型,验证码中单个字符的垂直偏移量,默认(0)垂直居中,如果offset_ver > 0
, 随机从[-offset_ver
,offset_ver
]中选取一个偏移量。 -
offset_hor
: 整型,验证码中单个字符的水平偏移量,默认(0)与前一个相接,如果offset_hor > 0
, 随机从[-offset_hor
,offset_hor
]中选取一个偏移量。 -
char_tran
: 浮点型数组,验证码中字符可选的透明度集合,单个元素取值范围[0.0,100.0]。
*注:以上参数都可以被CaptchaFactory.generate_captcha()
方法中的相关参数覆盖,即可以动态指
定每一个参数。
{
"texts": [
"resources/corpus/common_chinese.txt"
],
"fonts": [
"resources/font/PingFang_A.ttf",
"resources/font/STXINWEI.TTF"
],
"sizes": [
38,40,42
],
"colors": [
"0x32678b",
"0xe61514",
"0x3e0ac3"
],
"bgs": [
"0xfef6f6",
"resources/background/color.jpg"
],
"rotate": 30,
"num": 4,
"dot": 0,
"curve": 0,
"width": 200,
"height": 60,
"align": 2,
"offset_ver": 5,
"offset_hor": 6,
"char_tran": [
5.97
]
}
def main():
project_name = "demo"
with open("configs/%s.json" % project_name, encoding="utf-8") as fp:
demo_config = json.load(fp)
demo_factory = CaptchaFactory(**demo_config)
index = 3
while index:
captcha = demo_factory.generate_captcha()
captcha.save("output/%s/%s.jpg" % (project_name, captcha.text))
print(captcha.text, captcha.num)
index -= 1
其他完整样例见58gua_kao_factory.py
、icp_factory.py
、jingdong_factory.py
.
原始验证码 | 生成验证码 |
---|---|
此项目只提供了简单生成随机噪点或干扰先的方法,如有需要,可以通过简单配置config中dot
或
curve
生成。但更多时候,验证码中的干扰线和噪点都是需要自定义的,所以在
CaptchaFactory
的构造方法中提供了以下两个参数,用于接收相关的回调函数:
char_custom_fns
:如果对于单个字符有其他自定义操作,比如拉伸形变、膨胀腐蚀等, 可以通过此参数传入回调函数,支持多个回调函数随机调用。
def char_custom_fn(single_char):
# do something you wanted
# return single_char.filter(ImageFilter.GaussianBlur)
return single_char
bg_custom_fns
:如果对于验证码背景有其他自定义操作,比如高斯模糊、指定样式的噪点或干扰线等, 可以通过此参数传入回调函数,支持多个回调函数随机调用。
def bg_custom_fn(bg):
# do something you wanted
# return bg.filter(ImageFilter.GaussianBlur)
return bg
详细代码见jingdong_factory.py
.
可以通过Captcha.char_pos()
方法获取单个字符在验证码中的位置信息,返回一个四元组(x,y,w,h),
分别表示左上角x坐标,y坐标,宽,高,适用于物体检测,文字定位等问题,配合YOLO使用。
样例:
captcha = demo_factory.generate_captcha()
char_pos = captcha.char_pos
width = captcha.width
height = captcha.height
with open(os.path.join(output_path, txt_out), "w", encoding="utf-8") as fp:
for pos in char_pos:
x, y, w, h = pos
# 转化为中心点的坐标
# x = (x + w / 2) * 1.0 / width
# y = (y + h / 2) * 1.0 / height
- 新增配置项char_times:保证语料库中每个字符至少出现char_times次
- 配置项的颜色格式改为:#ffffff
- 新增分析原始验证码中前景背景色分布的功能
- 支持多线程生成验证码
- 新增常用图像处理方法(增强,扭曲等)
- 判断自生成验证码和原始验证码的相似度