44 lines
2.6 KiB
Markdown
44 lines
2.6 KiB
Markdown
# 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 裁剪 后再匹配。
|
||
|
||
3. 图像预处理一致性
|
||
|
||
为确保识别精度,本项目在 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](https://github.com/sml2h3/ddddocr) 的 Rust 移植版本,原作者为 sml2h3。衷心感谢原作者对 OCR 社区做出的杰出贡献。
|
||
- 推理引擎基于 [tract (Sonos)](https://github.com/sonos/tract)。感谢其为 Rust 生态提供的轻量级推理方案。 |