# fdu_xk_captcha a simple and fast captcha reader for xk.fudan.edu.cn ========================================================== ***** 注意这个程序只适用于旧版选课系统(现在已经下线) ***** ========================================================== 一个用来识别复旦选课系统验证码的程序 主要特点:算法简单,速度快,识别率高,纯 C 语言编写,依赖库少 核心算法:将待识别字符与字符库中字符逐一比对,差异最小者即为答案 识别速度:在批量识别模式下,每秒可以识别 10000 个验证码以上。(在我自己的电脑上) 识别率:在一次登录测试中 50000 个验证码全部识别正确,正确率至少在 99.99% 以上。 依赖库:libjpeg (版本 8d1) 接口说明: 头文件: include/ocr.h 函数原型: int ocr_jpeg(void *buf, int len, char ret[]); 参数: void *buf 指向验证码的 jpeg 数据的指针 int len 验证码的 jpeg 数据的长度 char ret[] 存放答案数组 返回值: 返回值若大于等于 0 则表示最大字符差异值,若小于 0 则说明出现错误 注意: 该函数不会在 ret 末尾处添加字符串结束符 '\0' 示例程序: sample/ocr_single 识别单个验证码文件 sample/ocr_batch 批量识别验证码,用来进行批量识别测试 使用方法: 1. 确认已经安装 libjpeg 库以及必要的头文件 2. 支持的命令如下 make 编译库及样例程序 make test 测试自带的样例验证码 make onlinetest 执行在线登录测试 make clean 清除所有产生的文件 常数优化: 本程序有专为 64 位平台设计的代码,而且可以使用 SSE4.2 指令集优化,不过需要修改代码来开启 关于 SSE4.2 指令集: 本程序计算字符间差异使用的是异或并计算结果二进制表示中 1 的个数的方法, 其中计算二进制表示中 1 的个数可以使用 SSE4.2 中的 POPCNT 指令优化 具体方法如下: 1. 修改 src/xk.h 开启所需要的编译选项 2. 修改 src/Makefile 根据需要修改 CFLAGS 变量 (开启 -mpopcnt 选项,并开启 -O3 优化) 3. 执行命令 make clean && make 性能测试: 对于自带的 50000 个样例验证码,在我自己的电脑上测试结果如下: (总时间 / 平均每个验证码时间) 默认编译选项(只开启 -O2 编译优化): 4.31s / 0.086ms 只开启 -O3 编译优化: 3.75s / 0.075ms 开启 -O3 编译优化,开启 64 位优化,使用 SSE4.2 指令集: 2.31s / 0.046ms