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 庫有任何問題或疑問,請通過我們的 論壇 聯繫我們以獲取任何問題或疑問。

也可以看看