Java OMR 库

您需要一个简单但功能丰富的 Java OMR 库吗?您想识别扫描图像中的光学标记吗?尝试 Aspose.OMR for Java - 一个 Java 类库,用于在基于 Java 的应用程序中执行光学标记识别 (OMR) 操作。让我们快速浏览一下上述 Java API 的功能,看看如何识别各种图像格式的光学标记,并从包含 MCQ 的调查、问卷或测试中捕获人工标记数据。

使用 Java OMR 库动态创建 OMR 模板

Aspose.OMR for Java 提供了从创建 OMR 模板到识别光学标记以捕获数据的一整套功能。 API 支持从简单的文本标记生成 OMR 模板文件或图像。您只需将模板的文本标记传递给 API,它就会为您生成模板。以下是 OMR 模板的示例文本标记。

?text=Name__________________________________ Date____________

?grid=ID
sections_count=8
#What is Aspose.OMR main function?
() OCR () Capture human-marked data
() There is no main function () Enhance images
#Can Aspose.OMR process photos as well?
() Yes, indeed! () No
#Aspose.OMR is available on any platform, because it is:
() Cross-platform code () Cloud service
#Aspose.OMR works with any kind of OMR forms: tests, exams, questionnaires, surveys, etc.
() Yes, indeed! () No
#Excellent recognition results can be achieved only for filled bubbles at least for:
() 40% () 60% () 75% () 98%
#Do you have to mark up every question on the page?
(Yes) Yes, that will help a lot! (No) No
#Rate your preference from 0 to 9 with "0" being preference towards performance
and "9" being preference towards flexibility.
(0) (1) (2) (3) (4) (5) (6) (7) (8) (9)
#I found aspose omr to be a useful tool. (5 - strongly agree, 1 - strongly disagree)
(5) (4) (3) (2) (1)

?text= Answer sheet section
?answer_sheet=MainQuestions
elements_count=10
columns_count=5

?text=Sign________________________________

您可以简单地将文本标记保存在扩展名为 .txt 的文本文件中。完成后,您可以使用以下步骤生成模板:

以下代码示例展示了如何使用 Java 从文本标记生成 OMR 模板。

String outputDirectory = "GenerationResult";

String[] GenerationMarkups = new String[] { "Sheet.txt", "Grid.txt", "AsposeTest.txt" };
String[] GenerationMarkupsNoExt = new String[] { "Sheet", "Grid", "AsposeTest" };

OmrEngine engine = new OmrEngine();

for (int i = 0; i < GenerationMarkups.length; i++)
{
    // 调用模板生成提供带有标记的 txt 文件的路径
    GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);

    // 检查是否有错误
    if (res.getErrorCode() != 0)
    {
        System.out.println("ERROR CODE: " + res.getErrorCode());
    }

    // 保存生成结果:图像和 .omr 模板
    res.save(outputDirectory, GenerationMarkupsNoExt[i]);
}

输出

Java OMR 库

使用 Java 的图像中的光学标记识别 (OMR)

为了在图像中执行 OMR,您只需要两件事 - 准备好的 OMR 模板 (.omr) 和图像(用户填写的表格/表格)来执行 OMR。 API 支持以下图像格式的 OMR:

以下是在图像中执行 OMR 的步骤:

以下代码示例展示了如何使用 Java 识别图像中的光学标记。

String[] UserImages = new String[] { "Sheet1.jpg", "Sheet2.jpg" };
String[] UserImagesNoExt = new String[] { "Sheet1", "Sheet2" };

String outputDirectory = "Result";
String templatePath = "Sheet.omr";

// 初始化引擎并获取模板处理器,提供 .omr 文件的路径
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// 图像循环
for (int i = 0; i < UserImages.length; i++) {
    // 要识别的图像的路径
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // 识别图像并接收结果
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // 将结果导出为 csv 字符串
    String csvResult = result.getCsv();

    String json = result.getJson();

    // 将 csv 保存到输出文件夹
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

为 OMR 使用自定义识别阈值

您还可以通过定义 0 到 100 之间的自定义阈值来微调 OMR 结果。增加阈值会使 API 在识别答案时更加严格。阈值可以在 TemplateProcessor.recognizeImage() 方法中设置为第二个参数,如以下 Java 代码示例所示。

String[] UserImages = new String[] { "Sheet1.jpg", "Sheet2.jpg" };
String[] UserImagesNoExt = new String[] { "Sheet1", "Sheet2" };

String outputDirectory = "Result";
String templatePath = "Sheet.omr";
int customThreshold = 40;

// 初始化引擎并获取模板处理器,提供 .omr 文件的路径
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// 图像循环
for (int i = 0; i < UserImages.length; i++) {
    // 要识别的图像的路径
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // 识别图像并接收结果
    RecognitionResult result = templateProcessor.recognizeImage(imagePath, customThreshold);

    // 将结果导出为 csv 字符串
    String csvResult = result.getCsv();

    String json = result.getJson();

    // 将 csv 保存到输出文件夹
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

重新计算 OMR 结果

在某些情况下,您可能希望使用不同的阈值重新计算 OMR 结果。在这种情况下,您无需反复调用 TemplateProcessor.recognizeImage(),而是可以使用 TemplateProcessor.recalculate() 方法配置 API 进行自动重新计算,以提高图像处理效率。以下代码示例显示了如何实现 OMR 结果的重新计算。

String[] UserImages = new String[] { "Sheet1.jpg", "Sheet2.jpg" };
String[] UserImagesNoExt = new String[] { "Sheet1", "Sheet2" };

String outputDirectory = "Result";
String templatePath = "Sheet.omr";

// 初始化引擎并获取模板处理器
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// 设置自定义阈值以用于重新计算
// 此值在范围内(0 到 100)
// 表示要识别的气泡图像上所需黑色像素的百分比
// 即值越低 - 气泡被计为填充所需的黑色像素越少,反之亦然
int CustomThreshold = 40;

// 图像循环
for (int i = 0; i < UserImages.length; i++)
{
    String image = UserImages[i];
    String imagePath = image;
    System.out.println("Processing image: " + imagePath);

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

    // 获取导出 csv 字符串
    String stringRes = result.getCsv();

    // 将 csv 保存到输出文件夹
    String outputName = UserImagesNoExt[i] + ".csv";

    PrintWriter wr = new PrintWriter(new FileOutputStream(outputName), true);
    wr.println(stringRes);

    System.out.println("Export done. Path: " + outputName);

    // 使用自定义阈值重新计算识别结果
    templateProcessor.recalculate(result, CustomThreshold);

    // 获取导出 csv 字符串
    stringRes = result.getCsv();

    // 保存重新计算的结果
    outputName = UserImagesNoExt[i] + "_recalculated.csv";

    wr = new PrintWriter(new FileOutputStream(outputName), true);
    wr.println(stringRes);

    System.out.println("Recalculated result export done. Path: " + outputName);
    System.out.println();
}

如果您对我们的 Java OMR 库有任何疑问或疑问,请通过我们的 论坛 与我们联系以获取任何问题或疑问。

也可以看看