中文点选验证码之自动识别
字数 1241 2025-08-18 11:37:37
中文点选验证码自动识别技术详解
1. 验证码生成原理
1.1 验证码生成流程
- 使用PHP的GD库生成汉字点选验证码
- 包含两种图片:
- ap_XXXXX.png:提示需要点击的文字(如"请依次点击图中的猎户室")
- mp_XXXXX.png:实际需要点击的文字图片(如"猎户实验室")
1.2 核心代码解析
function createImage($word, $imagePath, $type, $imageName) {
// 字体设置
$fontPath = 'msyh.ttc';
$fontSize = 20 * 0.75;
// 计算每个文字的尺寸
foreach ($word as $v) {
$fontarea = imagettfbbox($fontSize, 0, $fontPath, $v);
$textWidth = $fontarea[2] - $fontarea[0];
$textHeight = $fontarea[1] - $fontarea[7];
// 存储文字信息
$textArr[] = [
'text' => $v,
'size' => $fontSize,
'width' => $textWidth,
'height' => $textHeight
];
}
// 获取背景图片尺寸
list($imageWidth, $imageHeight, $imageType) = getimagesize($imagePath);
// 为每个文字生成随机位置
for($i = 0; $i < count($textArr); $i++) {
list($x, $y) = randPosition($textArr, $imageWidth, $imageHeight,
$textArr[$i]['width'], $textArr[$i]['height'], $i, $type);
$textArr[$i]['x'] = $x;
$textArr[$i]['y'] = $y;
}
// 创建图片实例并绘制文字
$image = imagecreatefromstring(file_get_contents($imagePath));
$color = imagecolorallocate($image, 0, 0, 0);
foreach($textArr as $v) {
imagefttext($image, $v['size'], 0, $v['x'], $v['y'], $color, $fontPath, $v['text']);
}
// 输出图片
imagepng($image, $imageName);
}
1.3 文字位置生成算法
function randPosition($textArr, $imgW, $imgH, $fontW, $fontH, $i, $type) {
switch($type) {
case 0: // 生成mp(点击目标图)
$x = rand($i*60, ($i+1)*60-$fontW-3);
$y = rand(40, 80);
break;
case 1: // 生成ap(提示图)
$x = ($i)*25+5;
$y = 25;
break;
}
return array($x, $y);
}
2. 验证码识别方法
2.1 OpenCV模板匹配法
2.1.1 原理
- 使用OpenCV的
matchTemplate()函数进行模板匹配 - 比较方法:
cv2.TM_CCOEFF_NORMED - 通过
cv.minMaxLoc()函数查找最佳匹配位置
2.1.2 实现步骤
- 从提示图(ap)中提取需要点击的文字
- 为每个目标文字创建模板
- 在目标图(mp)中搜索匹配区域
- 标记匹配区域并计算中心点坐标
2.1.3 优缺点
- 优点:实现简单,无需外部API
- 缺点:对字体变化敏感,当字体大小不一致时识别率下降
2.2 OCR识别法(推荐)
2.2.1 原理
- 使用腾讯云OCR-通用印刷体识别API
- 获取图片中所有文字及其位置信息
- 通过文字内容匹配而非图像匹配
2.2.2 实现步骤
- 调用OCR API识别提示图(ap),提取需要点击的文字
- 调用OCR API识别目标图(mp),获取所有文字及其位置
- 将ap中的目标文字与mp中的文字进行匹配
- 获取匹配文字的位置和边界框
2.2.3 优缺点
- 优点:识别率高,不受字体变化影响
- 缺点:依赖第三方API,可能有使用限制
3. 技术对比与选择建议
| 方法 | 实现难度 | 识别率 | 速度 | 适用场景 |
|---|---|---|---|---|
| OpenCV模板匹配 | 简单 | 中(字体一致时高) | 快 | 简单、固定字体验证码 |
| OCR识别 | 中等 | 高 | 依赖API响应 | 复杂、字体变化的验证码 |
推荐选择:对于生产环境,推荐使用OCR识别方法,因其具有更高的准确率和适应性。
4. 进阶讨论
4.1 对抗更复杂的验证码
- 扭曲变形文字:需要使用更高级的OCR或深度学习模型
- 干扰线和噪点:预处理阶段需要加入去噪算法
- 动态验证码:需要结合动态内容分析技术
4.2 机器学习方法
虽然本文未涉及,但对于更复杂的验证码,可考虑:
- CNN(卷积神经网络)进行文字检测
- RNN(循环神经网络)进行序列识别
- 端到端的验证码识别模型
5. 参考资源
6. 实现注意事项
- 遵守目标网站的使用条款,避免违反法律法规
- 考虑API调用的频率限制和成本
- 对于生产环境,应加入错误处理和重试机制
- 验证码识别技术应不断更新以适应验证码的演变
通过本文介绍的两种方法,可以有效解决大多数简单汉字点选验证码的自动识别问题。根据实际场景选择合适的方法,可以显著提高自动化测试或数据采集的效率。