中文点选验证码之自动识别
字数 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 实现步骤

  1. 从提示图(ap)中提取需要点击的文字
  2. 为每个目标文字创建模板
  3. 在目标图(mp)中搜索匹配区域
  4. 标记匹配区域并计算中心点坐标

2.1.3 优缺点

  • 优点:实现简单,无需外部API
  • 缺点:对字体变化敏感,当字体大小不一致时识别率下降

2.2 OCR识别法(推荐)

2.2.1 原理

  • 使用腾讯云OCR-通用印刷体识别API
  • 获取图片中所有文字及其位置信息
  • 通过文字内容匹配而非图像匹配

2.2.2 实现步骤

  1. 调用OCR API识别提示图(ap),提取需要点击的文字
  2. 调用OCR API识别目标图(mp),获取所有文字及其位置
  3. 将ap中的目标文字与mp中的文字进行匹配
  4. 获取匹配文字的位置和边界框

2.2.3 优缺点

  • 优点:识别率高,不受字体变化影响
  • 缺点:依赖第三方API,可能有使用限制

3. 技术对比与选择建议

方法 实现难度 识别率 速度 适用场景
OpenCV模板匹配 简单 中(字体一致时高) 简单、固定字体验证码
OCR识别 中等 依赖API响应 复杂、字体变化的验证码

推荐选择:对于生产环境,推荐使用OCR识别方法,因其具有更高的准确率和适应性。

4. 进阶讨论

4.1 对抗更复杂的验证码

  • 扭曲变形文字:需要使用更高级的OCR或深度学习模型
  • 干扰线和噪点:预处理阶段需要加入去噪算法
  • 动态验证码:需要结合动态内容分析技术

4.2 机器学习方法

虽然本文未涉及,但对于更复杂的验证码,可考虑:

  • CNN(卷积神经网络)进行文字检测
  • RNN(循环神经网络)进行序列识别
  • 端到端的验证码识别模型

5. 参考资源

  1. OpenCV模板匹配教程
  2. 腾讯云OCR文档
  3. 示例代码仓库

6. 实现注意事项

  1. 遵守目标网站的使用条款,避免违反法律法规
  2. 考虑API调用的频率限制和成本
  3. 对于生产环境,应加入错误处理和重试机制
  4. 验证码识别技术应不断更新以适应验证码的演变

通过本文介绍的两种方法,可以有效解决大多数简单汉字点选验证码的自动识别问题。根据实际场景选择合适的方法,可以显著提高自动化测试或数据采集的效率。

中文点选验证码自动识别技术详解 1. 验证码生成原理 1.1 验证码生成流程 使用PHP的GD库生成汉字点选验证码 包含两种图片: ap_ XXXXX.png:提示需要点击的文字(如"请依次点击图中的猎户室") mp_ XXXXX.png:实际需要点击的文字图片(如"猎户实验室") 1.2 核心代码解析 1.3 文字位置生成算法 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. 参考资源 OpenCV模板匹配教程 腾讯云OCR文档 示例代码仓库 6. 实现注意事项 遵守目标网站的使用条款,避免违反法律法规 考虑API调用的频率限制和成本 对于生产环境,应加入错误处理和重试机制 验证码识别技术应不断更新以适应验证码的演变 通过本文介绍的两种方法,可以有效解决大多数简单汉字点选验证码的自动识别问题。根据实际场景选择合适的方法,可以显著提高自动化测试或数据采集的效率。