光學標記識別 (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) 方法使用微調參數更新識別結果。
請下載 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 操作並提取數據:
- 首先,創建一個 OmrEngine 類的實例。
- 接下來,調用 getTemplateProcessor() 方法並初始化 TemplateProcessor 類對象。它以 OMR 模板文件路徑作為參數。
- 然後,以圖像路徑為參數調用 recognitionImage() 方法,獲取 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 模板文件路徑作為參數。
- 然後,以圖像路徑為參數調用 recognitionImage() 方法,獲取 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 中從圖像中提取數據,您可以使用 文檔 了解有關 Aspose.OMR for Java API 的更多信息。如有任何疑問,請隨時通過我們的免費支持論壇與我們聯繫。