光学标记识别OMR(Optical Mark Recognition)是解决信号自动录入的有效方法。利用光学方法将信息录入到计算机并进行识别处理,能极大地提高数据信息的采集速度,便于计算机存储、管理与检索。OMR技术快速简单,识别率高且成本低,广泛应用于各类标准化考试、各类调查问卷的统计、选举结果的统计等,是自动识别领域中应用较多的一种方法。
- 通过横向和纵向投影实现OMR定位和信息提取。通过搜索投影最大标准差所对应的方向实现角度校正,克服扫描误差引起图像偏斜的问题。图像无偏斜时,各选项纵横方向对齐,投影曲线起伏变化较大;当图像倾斜时选项的交错使投影起伏变化变小。由此,可用投影曲线的标准差为判断依据,确定图像偏转角度。
- 使图像在角度范围内以微小角度旋转,计算纵向投影的标准差,标准差最大的旋转角度作为最佳纠偏角度。
- 实验测试:对各种输入试卷图像进行大量测试,分析实验结果,总结失败的原因,并提出改进解决方案。
本仓库采用 monorepo 策略,核心代码存放于项目根目录下的 packages
文件夹当中。
- core: 验证程序,基于
lib
完成开发。主要用于对核心算法进行试用和验证。 - lib: 核心算法 crate ,基于
opencv
提供多种 OMR 纠偏方法。 - app: 基于 tauri 和核心算法库开发的桌面级程序。
此处主要讨论应用级别的 app
的系统架构。
该应用基于 tauri
开发,系统交互层面使用 Rust
完成,用户界面采用 React
技术栈编写。UI 组件使用 Material UI 。
采用多页面架构以适应多窗口应用。各个窗口之间通过 useLocalStorage 利用 localStorage
共享全局状态,降低了各个窗口之间同步基本数据的难度。
rust 部分引入 lib
库,使用线程池实现针对单个图片的加速处理或是针对多个图片的同时批量处理。
核心 lib
已实现的纠偏方案有:
- 基于投影标准差的方案
- 基于霍夫变换检测图中直线的方案
- 基于快速傅里叶变换找寻图中主导线的方案
我们使用 pnpm
作为我们的包管理器。
npm install -g pnpm
或者
npm install -g @pnpm/exe
如果您的电脑上没有安装 Node.js
也可以使用以下脚本安装 pnpm
。
使用 PowerShell:
iwr https://get.pnpm.io/install.ps1 -useb | iex
然后您可以使用 pnpm env
命令来安装 Node.js 。
该应用使用 Rust 进行开发,请参照 Rust官网 进行安装。