光学标记识别 (OMR) 是一种电子过程,允许读取和捕获人们在特殊类型的文档表格上标记的数据。该文档表单可以是测试或调查,由用户填写的气泡或方形输入组成。我们可以轻松地对此类调查表、问卷或测试表的扫描图像执行 OMR 操作,并以编程方式读取用户输入。在本文中,我们将学习如何在 Java 中执行 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 操作并提取数据:
- 首先,创建 OmrEngine 类的实例。
- 接下来,调用 getTemplateProcessor() 方法并初始化 TemplateProcessor 类对象。它将 OMR 模板文件路径作为参数。
- 然后,通过以图像路径为参数调用 recognizeImage() 方法来获取RecognitionResult 对象。
- 之后,使用 getCsv() 方法将识别结果作为 CSV 字符串获取。
- 最后,将 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);
执行 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 操作:
- 首先,创建 OmrEngine 类的实例。
- 接下来,调用 getTemplateProcessor() 方法并初始化 TemplateProcessor 类对象。它将 OMR 模板文件路径作为参数。
- 然后,通过以图像路径为参数调用 recognizeImage() 方法来获取RecognitionResult 对象。
- 接下来,使用 getCsv() 方法将识别结果导出为 CSV 字符串。
- 然后,将 CSV 结果保存为本地磁盘上的 CSV 文件。
- 接下来,调用 recalculate() 方法。它将 RecognitionResult 对象和阈值作为参数。
- 之后,使用 getCsv() 方法将识别结果导出为 CSV 字符串。
- 最后,将 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 的更多信息。如有任何歧义,请随时在我们的 免费支持论坛 上与我们联系。