使用 Java 执行 OMR 和提取数据

光学标记识别 (OMR) 是一种电子过程,允许读取和捕获人们在特殊类型的文档表格上标记的数据。该文档表单可以是测试或调查,由用户填写的气泡或方形输入组成。我们可以轻松地对此类调查表、问卷或测试表的扫描图像执行 OMR 操作,并以编程方式读取用户输入。在本文中,我们将学习如何在 Java 中执行 OMR 并从图像中提取数据。

本文将涵盖以下主题:

  1. 从图像中提取数据的 Java OMR API
  2. 从图像中提取数据
  3. 执行 OMR 并从多个图像中提取数据
  4. 提取具有阈值的 OMR 数据
  5. 通过重新计算提取 OMR 数据

Java OMR API 从图像中提取数据

为了执行 OMR 操作并从 支持的图像格式 中提取数据,我们将使用 Aspose.OMR for Java API。它允许设计、创建和识别答题纸、测试、MCQ 试卷、测验、反馈表、调查和选票。

API 的 OmrEngine 类处理模板的创建和图像处理。此类的 getTemplateProcessor(String templatePath) 方法创建 TemplateProcessor 实例用于处理模板和图像。我们可以使用 recognizeImage(String imagePath) 方法识别图像。它将所有 OMR 元素作为 RecognitionResult 类实例返回。该类的 getCsv() 方法生成带有识别结果的 CSV 字符串。 recalculate(RecognitionResult result, int recognitionThreshold) 方法使用微调参数更新识别结果。

下载 JAR API 或在基于 Maven 的 Java 应用程序中添加以下 pom.xml 配置。

<repository>
    <id>AsposeJavaAPI</id>
    <name>Aspose Java API</name>
    <url>http://repository.aspose.com/repo/</url>
</repository>
<dependency>
     <groupId>com.aspose</groupId>
     <artifactId>aspose-omr</artifactId>
     <version>19.12</version>
</dependency>

用Java从图像中提取数据

我们需要准备好的 OMR 模板 (.omr) 以及用户填写的表格/表格的图像来执行 OMR 操作。我们可以按照以下步骤对图像执行 OMR 操作并提取数据:

  1. 首先,创建 OmrEngine 类的实例。
  2. 接下来,调用 getTemplateProcessor() 方法并初始化 TemplateProcessor 类对象。它将 OMR 模板文件路径作为参数。
  3. 然后,通过以图像路径为参数调用 recognizeImage() 方法来获取RecognitionResult 对象。
  4. 之后,使用 getCsv() 方法将识别结果作为 CSV 字符串获取。
  5. 最后,将 CSV 结果保存为本地磁盘上的 CSV 文件。

以下代码示例展示了如何使用 Java 从 CSV 格式的图像中提取 OMR 数据。

// 此代码示例演示如何对图像执行 OMR 并提取数据
// OMR 模板文件路径
String templatePath = "C:\\Files\\OMR\\Sheet.omr";

// 图片文件路径
String imagePath = "C:\\Files\\OMR\\Sheet1.png";

// 初始化 OMR 引擎
OmrEngine engine = new OmrEngine();

// 获取模板处理器
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);

// 识别图像
RecognitionResult result = templateProcessor.recognizeImage(imagePath);

// 以 CSV 格式获取结果
String csvResult = result.getCsv();

// 保存 CSV 文件
PrintWriter wr = new PrintWriter(new FileOutputStream("C:\\Files\\OMR\\Sheet1.csv"), true);
wr.println(csvResult);
从 Java 中的图像中提取数据

在 Java 中执行 OMR 并从图像中提取数据。

下载本博文中使用的 OMR 模板

执行 OMR 并从多个图像中提取数据

我们可以对多个图像执行 OMR 操作,并按照前面提到的步骤将数据提取到每个图像的单独 CSV 文件中。但是,我们需要对所有图像一张一张地重复步骤 #3、4 和 5。

以下代码示例展示了如何使用 Java 从多个图像中提取 OMR 数据。

// 此代码示例演示如何对多个图像执行 OMR 并提取数据
// 工作文件夹路径
String folderPath = "C:\\Files\\OMR\\";

// OMR 模板文件路径
String templatePath = folderPath + "Sheet.omr";

// 图片文件路径
String[] UserImages = new String[] { "Sheet1.png", "Sheet2.png" };

// 初始化 OMR 引擎
OmrEngine engine = new OmrEngine();

// 获取模板处理器
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);

// 循环处理图像
for (int i = 0; i < UserImages.length; i++)
{
    String image = UserImages[i];
    String imagePath = folderPath + image;

    // 识别图像
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // 以 CSV 格式获取结果
    String csvResult = result.getCsv();

    // 保存 CSV 文件
    PrintWriter wr = new PrintWriter(new FileOutputStream(folderPath + "Sheet_" + i + ".csv"), true);
    wr.println(csvResult);
    System.out.println(csvResult);
}

在 Java 中提取具有阈值的 OMR 数据

我们可以根据要求执行具有阈值(0 到 100)的 OMR 操作。阈值越高,API 在突出显示答案时就越严格。请按照前面提到的步骤使用阈值执行 OMR。但是,我们只需要在第 3 步中调用重载的 recognizeImage(string, int32) 方法。它将图像文件路径和阈值作为参数。

以下代码示例显示了如何使用 Java 执行具有阈值的 OMR。

// 此代码示例演示如何使用 therashold 执行 OMR 并从图像中提取数据
// OMR 模板文件路径
String templatePath = "C:\\Files\\OMR\\Sheet.omr";

// 图片文件路径
String imagePath = "C:\\Files\\OMR\\Sheet1.png";

// 阈值
int CustomThreshold = 40;

// 初始化 OMR 引擎
OmrEngine engine = new OmrEngine();

// 获取模板处理器
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);

// 识别图像
RecognitionResult result = templateProcessor.recognizeImage(imagePath, CustomThreshold);

// 以 CSV 格式获取结果
String csvResult = result.getCsv();

// 保存 CSV 文件
PrintWriter wr = new PrintWriter(new FileOutputStream("C:\\Files\\OMR\\Sheet1_threshold.csv"), true);
wr.println(csvResult);
System.out.println(csvResult);

用 Java 重新计算提取 OMR 数据

在某些情况下,我们可能需要使用不同的阈值重新计算 OMR 结果。为此,我们可以将 API 配置为使用 TemplateProcessor.recalculate() 方法自动重新计算。它允许通过更改阈值设置来多次处理图像以获得所需的结果。我们可以按照以下给出的步骤执行带有重新计算的 OMR 操作:

  1. 首先,创建 OmrEngine 类的实例。
  2. 接下来,调用 getTemplateProcessor() 方法并初始化 TemplateProcessor 类对象。它将 OMR 模板文件路径作为参数。
  3. 然后,通过以图像路径为参数调用 recognizeImage() 方法来获取RecognitionResult 对象。
  4. 接下来,使用 getCsv() 方法将识别结果导出为 CSV 字符串。
  5. 然后,将 CSV 结果保存为本地磁盘上的 CSV 文件。
  6. 接下来,调用 recalculate() 方法。它将 RecognitionResult 对象和阈值作为参数。
  7. 之后,使用 getCsv() 方法将识别结果导出为 CSV 字符串。
  8. 最后,将 CSV 结果保存为本地磁盘上的 CSV 文件。

以下代码示例显示了如何使用 Java 使用重新计算方法执行 OMR。

// OMR 模板文件路径
String templatePath = "C:\\Files\\OMR\\Sheet.omr";

// 图片文件路径
String imagePath = "C:\\Files\\OMR\\Sheet1.png";

// 阈值
int CustomThreshold = 40;

// 初始化 OMR 引擎
OmrEngine engine = new OmrEngine();

// 获取模板处理器
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);

// 识别图像
RecognitionResult result = templateProcessor.recognizeImage(imagePath, CustomThreshold);

// 以 CSV 格式获取结果
String csvResult = result.getCsv();

// 保存 CSV 文件
PrintWriter wr = new PrintWriter(new FileOutputStream("C:\\Files\\OMR\\Sheet1.csv"), true);
wr.println(csvResult);

// 重新计算
// 您可以在此处应用新的阈值
templateProcessor.recalculate(result, CustomThreshold);

// 以 CSV 格式获取重新计算的结果
csvResult = result.getCsv();

// 保存重新计算的结果 CSV 文件
PrintWriter finalWr = new PrintWriter(new FileOutputStream("C:\\Files\\OMR\\Sheet1_recalculated.csv"), true);
finalWr.println(csvResult);

获得免费许可证

您可以获得免费的临时许可证 试用该库而不受评估限制。

结论

在本文中,我们学习了如何:

  • 对图像进行OMR操作;
  • 以编程方式提取 CSV 格式的数据;
  • 在对图像执行 OMR 时应用阈值设置;
  • 使用 Java 重新计算汽车流程中的 OMR 结果。

此外,在 Java 中从图像中提取数据,您可以使用 documentation 了解有关 Aspose.OMR for Java API 的更多信息。如有任何歧义,请随时在我们的 免费支持论坛 上与我们联系。

也可以看看