Files
ddddocr-rs/README.md
CNWei 21bd1c93bf feat: 完成 Rust 滑块匹配算法,修复透明留白导致的坐标偏移
- 实现灰度与边缘两种匹配模式
- 对齐 OpenCV NCC 算法逻辑
- 优化图像灰度化与 Alpha 通道转换
- 提升坐标计算精度至像素级
2026-05-08 16:03:33 +08:00

2.6 KiB
Raw Blame History

ddddocr-rs

带带弟弟 OCR (ddddocr) 的 Rust 移植版。高性能、低占用,支持多种验证码识别与检测。

🧩 滑块识别算法核心知识点总结 本项目实现了两种核心匹配模式,其底层逻辑与 OpenCV 的对齐情况如下:

  1. 匹配模式对比 (Match Modes)

    模式 算法原理 适用场景 备注
    边缘模式 (Edge-based) 基于 Canny 边缘检测 提取轮廓后再进行匹配。 推荐方案
    。适用于绝大多数拼图滑块。 天然免疫拼图周边的透明/黑色留白干扰,坐标最精准。
    简单模式 (Simple/Gray) 直接基于 灰度像素值 进行归一化互相关计算。 适用于无明显边缘、靠颜色差异识别的场景。 对背景和透明边框敏感,可能存在重心偏移。
  2. 数学公式差异 (NCC vs. CCOEFF) 在简单模式下,本项目采用的是 归一化互相关 (NCC),对应 OpenCV 中的 TM_CCORR_NORMED。

逻辑对齐Rust 的 match_template 结果与 Python cv2.TM_CCORR_NORMED 完全一致。

关于偏移若拼图原始图片Target四周包含大量的透明留白

CCORR (本项目):会将留白视为图像的一部分,计算出的是整张图片框的中心。

CCOEFF (OpenCV 默认):会自动进行“均值中心化”,在一定程度上能削弱留白的影响。

最佳实践:若发现坐标有固定位移,建议优先切换至 边缘模式,或对滑块图进行 Bounding Box 裁剪 后再匹配。

  1. 图像预处理一致性

    为确保识别精度,本项目在 Rust 中完美复刻了 Python OpenCV 的预处理链路:

  • 灰度化权重:采用 OpenCV 标准感光公式 $0.299R + 0.587G + 0.114B$。

  • Alpha 处理:在将 PNG 转为 RGB 时,自动将透明区域填充为黑色,确保与 PIL (Python Imaging Library) 行为一致。

  • 坐标定义:所有返回坐标均为匹配区域的 几何中心点 $(x + w/2, y + h/2)$。

💡 开发者建议:

如果识别结果在 X 轴上有大约 10px 左右的固定误差,通常是因为滑块原图自带了透明边距(留白)。此时请确保 simple_target=false。该模式会通过 Canny 边缘检测 提取轮廓特征,能自动锁定拼图实体并忽略背景留白的像素干扰。 鸣谢 (Credits)

  • 本项目是 ddddocr 的 Rust 移植版本,原作者为 sml2h3。衷心感谢原作者对 OCR 社区做出的杰出贡献。
  • 推理引擎基于 tract (Sonos)。感谢其为 Rust 生态提供的轻量级推理方案。