原創|使用教程|編輯:龔雪|2015-07-20 10:54:28.000|閱讀 717 次
概述:我們經常使用表單識別和處理解決各種各樣的任務,包括分類、文檔歸檔、OCR識別和光學標記(OMR)識別。基于OMR表單創建的時間稍長和準確檢測掃描文檔中OMR字段的比較困難,使得OMR在文檔圖像中經常被誤解且沒有被充分利用。創建和處理OMR表單非常耗時,此白皮書將討論如何通過自動檢測、分類和處理緩解這些問題。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
大多數表單使用少量的OMR字段捕捉信息,如性別和婚姻狀況。這幾乎沒什么困難,因為處理的字段非常少。另一方面,創建和處理多項選擇題為主體的表單非常困難,因為大量的字段會出現在一個頁面里。此外,復選框、氣泡和其他尺寸很小類型的OMR字段,造成了潛在的問題,會導致更多的錯誤結果。
下面,我們將為您詳細講解如何使用LEADTOOLS創建一個OMR表單識別應用程序來緩解這兩個常見問題。這個備受殊榮的圖像SDK包含了所有必須的工具,將省時、程序員友好的API與最精準的識別率結合,最終解決方案的質量將達到一個無與倫比的水平。
表單識別應用程序的第一步是創建主表單。這些主表單或空白的表單模板有兩個主要作用。第一,使用它們確定掃描文檔表單的類型。第二,字段表明了表單中數據識別和提取的區域。對許多系統來說,創建一個基于OMR的表單非常繁瑣,因為它包含了很多重復的選擇框。手動繪制每一個字段非常耗時。值得慶幸的是,LEADTOOLS的IOcrEngine.AutoZone方法可以自動檢測所有OMR字段。在頁面中找到每個區域后,你可以在集合中循環,為每一個OMR區域添加一個新的OMR字段。
FormPages formPages = currentMasterForm.ReadFields(); // 創建 OCR 引擎 using (IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false)) { ocrEngine.Startup(null, null, null, null); ocrEngine.SettingManager.SetEnumValue("Recognition.Zoning.Options", "Detect Text, Detect Graphics, Use Text Extractor, Detect Checkbox"); using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument()) { // 自動分區 ocrDocument.Pages.AddPages(rasterImageViewer1.Image, 1, 1, null); ocrDocument.Pages.AutoZone(OcrZoneParser.Leadtools, OcrZoneFillMethod.Omr, LogicalUnit.Pixel, 0, 0, null); // 為每一個OMR區域添加一個表單列表 FormField newField; IOcrZoneCollection zones = ocrDocument.Pages[0].Zones; for (int i = 0; i < zones.Count; i++) { if (zones[i].FillMethod == OcrZoneFillMethod.Omr) { newField = new OmrFormField(); newField.Bounds = zones[i].Bounds; newField.Name = string.Format("OMR Field {0}", i); formPages[oldSelectedPageIndex].Add(newField); } } } currentMasterForm.WriteFields(formPages); }
OCR引擎的AutoZone方法獲取每一個區域的位置,但是有很多方法命名它們。這個簡單的例子為所有區域起了一個基本名稱,但可以檢查FormField.Bounds屬性決定哪些區域在相同的行或列,通過此方法擴展這個邏輯,更智能的命名區域。此外,你還可以使用主表單編輯器示例或手動編輯存儲字段數據的XML文件。
大多數掃描文檔處理系統必須能夠處理多種表單類型。一個可行的低效率解決方案可能針對不同類型的表單使用不同的應用程序、按鈕或對框。這可以實現自動化的數據處理,但并非全自動,它需要手動通知應用程序使用哪個表單模板處理掃描圖像。最佳的解決方案是自動識別或分類表單,然后基于這些發現處理。LEADTOOLS提供了可靠靈活的大量分類數據的表單識別能力,包括logo、黑白區域、OCR、條碼等。
// 為機器上的每一個處理器創建一個OCR引擎。允許在識別和處理過程中優先使用線程。 ocrEngines = new List<IOcrEngine>(); for (int i = 0; i < Environment.ProcessorCount; i++) { ocrEngines.Add(OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false)); ocrEngines[i].Startup(formsCodec, null, String.Empty, String.Empty); } // 將資源庫指向包含已有主表單的文件夾 formsRepository = new DiskMasterFormsRepository(formsCodec, masterFormsFolder); autoEngine = new AutoFormsEngine(formsRepository, ocrEngines, null, AutoFormsRecognitionManager.Default | AutoFormsRecognitionManager.Ocr, 30, 80, true); string[] formsToRecognize = Directory.GetFiles(filledFormsFolder); progressBar1.Maximum = formsToRecognize.Length; for (int i = 0; i < formsToRecognize.Length; i++) { // 識別(分類)表單 lblStatus.Text = string.Format("Recognizing form {0} of {1}", i + 1, formsToRecognize.Length); AutoFormsRunResult runResult = autoEngine.Run(formsToRecognize[i], null); if (runResult != null) { // 識別成功 lblStatus.Text = string.Format("Processing form {0} of {1}", i + 1, formsToRecognize.Length); ProcessResults(runResult); } progressBar1.Value++; }
一旦表格識別成功,就可以處理字段,從填好的文檔中提取OMR數據。選擇OMR解決方案的一個重要考慮因素是如果準確處理填寫風格的差異。盡管在填寫表單時有嚴格的規定,但是每個人填寫OMR字段的方法都各不相同。
如果你還記得圖1,你會發現字段以問題編號和列編號命名,中間用連字符分隔。有了這樣的命名模式,我們就可以輕松確定每列中填寫了哪個復選框,然后將它添加到我們的數據源中。
int nNewRowIndex = dataGridView1.Rows.Add(); foreach (FormPage formPage in runResult.FormFields) { foreach (FormField field in formPage) { if (field.Result.GetType() == typeof(OmrFormFieldResult)) { // 填寫復選框了嗎? if ((field.Result as OmrFormFieldResult).Text == "1") { // 獲取這個復選框的問題編號和值(列標號) string[] strQuestionValue = field.Name.Split('-'); dataGridView1.Rows[nNewRowIndex].Cells[string.Format("col{0}", strQuestionValue[0])].Value = strQuestionValue[1]; } } } }
當然有很多方法可以命名字段并將答案與你的數據源關聯。在應用程序的開始階段你可以小小的計劃一下,使用LEADTOOLS根據任意的主表單和數據源設計你自己的OMR表單識別解決方案,這個解決方案可靠、靈活且準確。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn