使用 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) 方法使用微調參數更新識別結果。

下載 API 的 JAR 或在基於 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. 然後,以圖像路徑為參數調用 recognitionImage() 方法,獲取 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. 然後,以圖像路徑為參數調用 recognitionImage() 方法,獲取 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 中從圖像中提取數據,您可以使用 文檔 了解有關 Aspose.OMR for Java API 的更多信息。如有任何疑問,請隨時通過我們的免費支持論壇與我們聯繫。

也可以看看