1. 产品
  2.   Aspose.OMR
  3.   Aspose.OMR FOSS for Python

Python 的 Aspose.OMR FOSS

在 Python 中设计 OMR 答题卡并从扫描图像中识别已标记的气泡 — 免费、开源且 MIT 许可证。

开源 Python 库用于光学标记识别

Aspose.OMR FOSS for Python 是一个免费、开源的库,用于设计 OMR(光学标记识别)表单——多项选择答卷、复选框表单和调查——以及从扫描或拍摄的图像中识别受访者填写的标记。它面向在纯 Python 环境中自动化考试评分、调查统计或基于表单的数据收集的开发者,构建时仅依赖 numpy、opencv-python 和 Pillow,没有其他更奇特的依赖。一个 OmrEngine 覆盖整个工作流——Generate() 将模板(可以是先用代码构建的 TemplateConfig 树,包含 ChoiceBoxConfig、CheckBoxConfig、GridConfig、AnswerSheetConfig 等元素,或使用紧凑的文本标记 DSL 编写的)转换为页面图像和一个 .omr 描述文件;GetTemplateProcessor() 加载该描述文件,以使用 Recognize() 或 RecognizeFolder() 识别新的扫描件,返回可导出为 CSV、JSON 或 XML 的结果。该库采用 MIT 许可证,使用单个 pip 命令即可安装(见下文);它是早期版本(v0.1.0,开发状态:Alpha),覆盖完整 Aspose.OMR 表面的基础、生成和识别层——此版本的渲染仅支持 LTR/西文,RTL 书写系统和完整的溢出处理已在上游路线图中跟踪,但尚未实现。企业产品系列请参见 Aspose.OMR — Enterprise Product Family。

设计并生成 OMR 表单

  • 代码优先模板: TemplateConfig、PageConfig以及元素配置 (ChoiceBoxConfig、CheckBoxConfig、GridConfig、CompositeGridConfig、AnswerSheetConfig) 描述页面上的每个字段。
  • 标记 DSL: 紧凑的文本格式 (?choicebox=... / &choicebox) 在不手动构建对象的情况下构建相同的结构。
  • 书写系统枚举: Arabic、Hebrew、Persian、Urdu、Bengali 和 Western 用于在 API 与 Aspose.OMR 表面之间保持忠实;此版本的渲染器仅支持 LTR/Western — RTL 渲染尚未实现。
  • 溢出枚举: LongWordHandling 和 OverflowAction 子类 (Clip、NoClip、Wrap) 能够正确解析和验证,但此版本的渲染器尚未遵循它们 — 实际的溢出行为尚不可配置。
  • 复选框和选择组: CheckBoxConfig 与 ChoiceBoxConfig 支持多选;FormValidationLogic 在每个 TemplateProcessor 中设置一次,如果一个 Multiselect 已禁用的问题收到多个标记,则可以触发异常。

可以使用 Aspose.OMR FOSS 的位置

  • 考试和测验: 生成多项选择答题卡并识别已填充的气泡以实现自动评分。
  • 调查和表单: 使用 AnswerSheetConfig 构建编号的答题卡矩阵,以进行大规模的响应收集。
  • 数据录入网格: GridConfig 和 CompositeGridConfig 捕获数值或自定义符号输入,合并为一个值。
  • 可打印输出: Save() 将准备好的可打印 PNG 页面连同用于后续识别的 .omr 描述符一起写入。
  • 批处理流水线: RecognizeFolder() 在一次调用中处理整个扫描文件夹。

识别标记并导出结果

  • Stateless engine: OmrEngine.Generate() 生成一个 GenerationResult(页面图像 + .omr 模板 JSON);GetTemplateProcessor() 加载该模板以识别新的扫描。
  • Multiple export formats: RecognitionResult 可导出为 CSV、JSON 或 XML,每种格式都有相应的流变体。
  • In-memory results too: MemoryGenerationResult 通过 GetImages()/GetOmr() 将生成的图像以内存流的形式公开 —— 无需磁盘 I/O。
  • De-skew and recalibration: 识别过程会根据角落参考标记校正扫描倾斜,Recalculate() 可在不重新扫描的情况下重新应用不同的阈值。
  • Embedded images: ImageCollection 允许标记通过名称引用内存中的图像字节,避免文件系统往返。

开发者体验

Aspose.OMR FOSS for Python 只需一个 pip 命令即可安装(请参见下面的快速入门示例)。The API 围绕三个对象 — OmrEngine、TemplateConfig 树(或标记 DSL),以及 TemplateProcessor —,覆盖整个 generate → scan → recognize → export 工作流。

该库仅依赖 numpy、opencv-python 和 Pillow — 无需编译本机 OMR 二进制文件。它采用 MIT 许可证,托管在 GitHub 上,当前处于早期 v0.1.0 版本,覆盖完整 Aspose.OMR 表面的基础、生成和识别层。

生成表单并识别扫描答案

构建(或加载)模板,保存生成的页面图像和 .omr 描述符,然后识别扫描副本并将结果导出为 CSV。

git clone https://github.com/aspose-omr-foss/Aspose.OMR-FOSS-for-Python.git
cd Aspose.OMR-FOSS-for-Python
pip install -e .
from omr.api import OmrEngine, FormValidationLogic
engine = OmrEngine()
gen = engine.Generate("final-exam.txt")          # or a code-first TemplateConfig
gen.Save("out", "final-exam")                    # -> out/final-exam.png + out/final-exam.omr
processor = engine.GetTemplateProcessor("out/final-exam.omr", FormValidationLogic.Ignore)
result = processor.Recognize("scan.png")         # -100 = auto-calibrated threshold
print(result.GetCsv())                           # also GetJson() / GetXml()

从标记构建多项选择题

文本标记 DSL 构建的元素树与代码优先的 API 相同。这里 ?choicebox=... 用于打开一个选择框问题,下一行列出其选项,&choicebox 用于关闭它 — Generate() 返回一个 .Template JSON 描述符,您可以直接检查。

import json
from omr.api import OmrEngine
markup = [
    "?choicebox=Rate it",
    "(1) Poor (2) Fair (3) Good",
    "&choicebox",
]
engine = OmrEngine()
result = engine.Generate(markup)
desc = json.loads(result.Template)
cb = desc["Pages"][0]["Elements"][0]
print([b["Value"] for b in cb["Fields"][0]["Bubbles"]])  # ['Poor', 'Fair', 'Good']

常见问题

什么是 Aspose.OMR FOSS for Python 的许可模式?

它在 MIT 许可证下分发 — 免费使用、修改和分发,包括在商业产品中,前提是包含原始版权声明。

它需要哪些 Python 版本和依赖项?

Python 3.10 或更高版本,pip 会自动安装三个依赖 — numpy、opencv-python 和 Pillow。无需原生 OMR 硬件或外部服务。

我可以将生成的模板导出为 PDF 吗?

此版本中没有。GenerationResult.SaveAsPdf() 和 MemoryGenerationResult.GetPDF() 都会抛出 NotImplementedError。请改用 Save() 或 GetImages() 的 PNG 输出。

我可以将识别结果导出为哪些格式?

RecognitionResult 可通过 GetCsv()、GetJson() 和 GetXml() 导出为 CSV、JSON 或 XML,每种方式都有相应的内存流变体。

它支持除英语以外的其他语言吗?

尚未支持渲染。模板层定义了阿拉伯语、希伯来语、波斯语、乌尔都语和孟加拉语书写系统,以与 Aspose.OMR 表面保持一致,但此版本的渲染引擎仅支持 LTR/Western —— RTL 渲染和本地数字排版仍在上游路线图上,尚未实现。

是否支持多选答案验证?

是的,对于已禁用 Multiselect 的问题。将 FormValidationLogic.Exception 传递给 GetTemplateProcessor(),在此类问题收到多个标记时抛出;默认的 Ignore 会静默接受。GlobalPageSettings.Multiselect 默认启用。

  

支持和学习资源

 中文