/// <summary> /// OCR処理 /// </summary> /// <param name="image">二値化画像</param> /// <param name="env">OCR実行環境</param> /// <param name="charOpt">OCR実行対象データ</param> /// <returns>OCR結果エンティティ</returns> public OcrExecuteResult executeOcr(Image image, CharOption charOpt, RcFontType mode) { OcrExecuteResult result = new OcrExecuteResult(); OcrExecuteEnv env = this.Env; image = executeExtractImage(image, new Rectangle(1, 1, image.Width - 2, image.Height - 2)); if ((mode & RcFontType.JOCR) == RcFontType.JOCR) { try { // 活字OCR処理の実行 result.JocrResultList = executeJocr(image, env, charOpt); } catch { } } if ((mode & RcFontType.HOCR) == RcFontType.HOCR) { try { //手書 result.HocrResultList = executeHocr(image, env, charOpt); } catch (Exception ex) { string num = ex.Message; } } result.judgeResult(); return(result); }
/// <summary> /// OCR実行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { if (this.SelectedRow != -1) { PictureBox pic = this.tableLayoutPanel1.GetControlFromPosition(1, this.SelectedRow) as PictureBox; if (pic == null) { return; } Image resultImg = pic.Image; counter.Start("ocrExecute"); DoOcrSDK ocrSdk = new DoOcrSDK(); ocrSdk.ocrExecuteBegin(); CharOption opt = GetOption(); TransArea area = (TransArea)pic.Tag; var result = ocrSdk.executeDoOcr(resultImg, area, opt, GetOcrMode()); MessageBox.Show(result.ResultCharLine); this.txtResult.Text = result.ResultCharLine; ocrSdk.ocrExecuteEnd(); counter.End(); Image rangeImg = result.DrawRange(resultImg); this.pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; pictureBox1.Image = rangeImg; } }
/// <summary> /// DoOCR認識対象文字種の値作成 /// </summary> /// <param name="ocrExecItem">OCR実行ビュー</param> /// <returns>認識対象文字種</returns> private DoOcrSDKCharType createDoOcrCharType(CharOption charOpt) { DoOcrSDKCharType charType = 0; // 第1水準漢字 if (charOpt.JISLevel1KanjiSetRcFlag) { charType |= DoOcrSDKCharType.KANJI1; } // 第2水準漢字 if (charOpt.JISLevel2KanjiSetRcFlag) { charType |= DoOcrSDKCharType.KANJI2; } // ひらがな if (charOpt.HiraganaRcFlag) { charType |= DoOcrSDKCharType.HIRAGANA; } // カタカナ if (charOpt.KatakanaRcFlag) { charType |= DoOcrSDKCharType.KATAKANA; } // 数字 if (charOpt.NoRcFlag) { charType |= DoOcrSDKCharType.NUMERAL; } // 英大文字 if (charOpt.UpperCaseRcFlag) { charType |= DoOcrSDKCharType.ALPHABETUPPER; } // 英小文字 if (charOpt.LowerCaseRcFlag) { charType |= DoOcrSDKCharType.ALPHABETLOWER; } return(charType); }
private CharOption GetOption() { CharOption opt = new CharOption() { NoRcFlag = this.chkNoRcFlag.Checked, UpperCaseRcFlag = this.chkUpperCaseRcFlag.Checked, LowerCaseRcFlag = this.chkLowerCaseRcFlag.Checked, HiraganaRcFlag = this.chkHiraganaRcFlag.Checked, KatakanaRcFlag = this.chkKatakanaRcFlag.Checked, JISLevel1KanjiSetRcFlag = this.chkJISLevel1KanjiSetRcFlag.Checked, JISLevel2KanjiSetRcFlag = this.chkJISLevel2KanjiSetRcFlag.Checked, Symbol1RcFlag = this.chkSymbol1RcFlag.Checked, Symbol2RcFlag = this.chkSymbol2RcFlag.Checked, PunctuationRcFlag = this.chkPunctuationRcFlag.Checked, }; return(opt); }
/// <summary> /// 活字OCR処理の実行 /// </summary> /// <param name="image">二値化画像</param> /// <param name="env">OCR実行環境</param> /// <param name="ocrExecItem">OCR実行対象データ</param> private List <SDKResult> executeJocr(Image image, OcrExecuteEnv env, CharOption charOpt) { //// 手書きOCR処理 //IJocrSDKComponent jocrSdk = JocrSDKInterface.JocrSDKFactory.GetJocrSDK(); //var chartype = purseJocrParameter(charOpt); //// 認識対象文字種の設定 //jocrSdk.SetCharType(env.jocrLibHandle, env.jocrPatDictHandle, chartype); //// 実行パラメーターの設定 //JocrSDKInterface.JocrSDKParam param = new JocrSDKInterface.JocrSDKParam() //{ // line_dir = JocrSDKLineDir.JOCR_LD_HORIZONTAL, // char_dir = JocrSDKCharDir.JOCR_CD_NORTH, // edge_mode = JocrSDKEdgeMode.JOCR_EM_IGNORE, // lineseg_level = JocrSDKLineSegLevel.JOCR_LL_DEFAULT, // charseg_level = JocrSDKCharSegLevel.JOCR_CL_DEFAULT, // quick_level = JocrSDKQuickLevel.JOCR_QL_MEDIUM, // post_mode = JocrSDKPostMode.JOCR_PM_OFF, // output_mode = JocrSDKOutputMode.JOCR_OM_NONE, //}; //// 対象領域の設定 //JocrSDKInterface.JocrSDKArea area = new JocrSDKInterface.JocrSDKArea() //{ // xs = 0, // ys = 0, // xe = System.Convert.ToInt16(image.Size.Width - 1), // ye = System.Convert.ToInt16(image.Size.Height - 1), //}; //// 活字OCR1行認識の実行 //List<JocrSDKResult> jocrRetList = jocrSdk.ExecuteOneLine(env.jocrLibHandle, env.jocrEnvHandle, // image, area, param, MaxOcrOneLineLength); //List<SDKResult> retList = new List<SDKResult>(); //if (jocrRetList != null && jocrRetList.Count > 0) //{ // jocrRetList.ForEach(x => retList.Add(new SDKResult(x))); //} //return retList; return(null); }
private CharOption GetOption() { CharOption opt = new CharOption() { NoRcFlag = this.chkNoRcFlag.Checked, UpperCaseRcFlag = this.chkUpperCaseRcFlag.Checked, LowerCaseRcFlag = this.chkLowerCaseRcFlag.Checked, HiraganaRcFlag = this.chkHiraganaRcFlag.Checked, KatakanaRcFlag = this.chkKatakanaRcFlag.Checked, JISLevel1KanjiSetRcFlag = this.chkJISLevel1KanjiSetRcFlag.Checked, JISLevel2KanjiSetRcFlag = this.chkJISLevel2KanjiSetRcFlag.Checked, Symbol1RcFlag = this.chkSymbol1RcFlag.Checked, Symbol2RcFlag = this.chkSymbol2RcFlag.Checked, PunctuationRcFlag = this.chkPunctuationRcFlag.Checked, RcDigit = (int)this.numRigit.Value, RcForm = string.IsNullOrEmpty(this.txtRcForm.Text)?string.Empty:this.txtRcForm.Text }; return(opt); }
/// <summary> /// 手書きOCR処理の実行 /// </summary> /// <param name="image">二値化画像</param> /// <param name="env">OCR実行環境</param> /// <param name="ocrExecItem">OCR実行対象データ</param> private List <SDKResult> executeHocr(Image image, OcrExecuteEnv env, CharOption charOpt) { //// 手書きOCR処理 //IHocrSDKComponent hocrSdk = HocrSDKInterface.HocrSDKFactory.GetHocrSDK(); //var chartype = purseHocrParameter(charOpt); //// 認識対象文字種の設定 //hocrSdk.SetCharType(env.hocrLibHandle, env.hocrPatDictHandle, chartype); //// 実行パラメーターの設定 //HocrSDKInterface.HocrSDKParam param = new HocrSDKInterface.HocrSDKParam() //{ // quick_level = HocrSDKInterface.HocrSDKRecogLevel.HOCR_QL_LOW, //}; //// 対象領域の設定 //HocrSDKInterface.HocrSDKArea area = new HocrSDKInterface.HocrSDKArea() //{ // xs = 0, // ys = 0, // xe = System.Convert.ToInt16(image.Size.Width - 1), // ye = System.Convert.ToInt16(image.Size.Height - 1), //}; //// 手書きOCR1行認識の実行 //List<HocrSDKResult> hocrRetList = hocrSdk.ExecuteOneLine(env.hocrLibHandle, env.hocrEnvHandle, // image, area, param, MaxOcrOneLineLength); //List<SDKResult> retList = new List<SDKResult>(); //if (hocrRetList != null && hocrRetList.Count > 0) //{ // hocrRetList.ForEach(x => retList.Add(new SDKResult(x))); //} //return retList; return(null); }
/// <summary> /// DoOCR記号フラグの値作成 /// </summary> /// <param name="ocrExecItem">OCR実行ビュー</param> /// <returns>記号フラグ</returns> private DoOcrSDKSymbolFlag createDoOcrSymbolFlag(CharOption charOpt) { DoOcrSDKSymbolFlag symbolFlag = 0; // 記号1 if (charOpt.Symbol1RcFlag) { symbolFlag |= DoOcrSDKSymbolFlag.SYMBOL_1; } // 記号2 if (charOpt.Symbol2RcFlag) { symbolFlag |= DoOcrSDKSymbolFlag.SYMBOL_2; } // 句読点 if (charOpt.PunctuationRcFlag) { symbolFlag |= DoOcrSDKSymbolFlag.SYMBOL_KANA; } return(symbolFlag); }
/// <summary> /// 活字OCR認識対象文字種のパラメーター解析 /// </summary> /// <param name="ocrExecItem">OCR実行ビュー</param> /// <returns>認識対象文字種</returns> private JocrSDKInterface.JocrSDKCharType purseJocrParameter(CharOption charOpt) { JocrSDKInterface.JocrSDKCharType charType = 0; // 数字 if (charOpt.NoRcFlag) { charType |= JocrSDKCharType.JOCR_CT_NUM; } // 英大文字 if (charOpt.UpperCaseRcFlag) { charType |= JocrSDKCharType.JOCR_CT_ALPH_UPPER; } // 英小文字 if (charOpt.LowerCaseRcFlag) { charType |= JocrSDKCharType.JOCR_CT_ALPH_LOWER; } // カタカナ if (charOpt.KatakanaRcFlag) { charType |= JocrSDKCharType.JOCR_CT_KATAKANA; } // ひらがな if (charOpt.HiraganaRcFlag) { charType |= JocrSDKCharType.JOCR_CT_HIRAGANA; } // 第1水準漢字 if (charOpt.JISLevel1KanjiSetRcFlag) { charType |= JocrSDKCharType.JOCR_CT_KANJI; } // 第2水準漢字 if (charOpt.JISLevel2KanjiSetRcFlag) { charType |= JocrSDKCharType.JOCR_CT_KANJI2; } // 記号1 if (charOpt.Symbol1RcFlag) { charType |= JocrSDKCharType.JOCR_CT_SYMBOL; } // 記号2 if (charOpt.Symbol2RcFlag) { charType |= JocrSDKCharType.JOCR_CT_SYMBOL; } // 句読点 if (charOpt.PunctuationRcFlag) { charType |= JocrSDKCharType.JOCR_CT_SYMBOL; } return(charType); }
/// <summary> /// DoOCR処理 /// </summary> /// <param name="image">二値化画像</param> /// <param name="env">OCR実行環境</param> /// <param name="ocrExecItem">OCR実行対象データ</param> /// <param name="monitoring">監視フォルダ定義</param> /// <returns>DoOCR結果エンティティのリスト</returns> public DoOcrExceuteResult executeDoOcr(Image image, TransArea transArea, CharOption charOpt, RcFontType mode) { IDoOcrSDKComponent doOcrSdk = DoOcrSDKFactory.GetDoOcrSDK(); // 活字認識用環境の設定 DoOcrSDKJocrEnvHandle jocrEnv; if ((mode & RcFontType.JOCR) == RcFontType.JOCR) { // 認識字体が活字か両方 // ライブラリハンドル DoOcrSDKJocrLibHandle jocrLibHandle = new DoOcrSDKJocrLibHandle() { pLibHandle = this.Env.jocrLibHandle.pLibHandle, }; // 辞書ハンドル DoOcrSDKJocrHandle jocrDicHandle = new DoOcrSDKJocrHandle() { handle = this.Env.jocrPatDictHandle.handle, }; // 言語辞書ハンドル DoOcrSDKJocrHandle jocrLDicHandle = new DoOcrSDKJocrHandle() { handle = this.Env.jocrLangDictHandle.handle, }; jocrEnv = new DoOcrSDKJocrEnvHandle() { libHandle = jocrLibHandle, // ライブラリハンドル dicHandle = jocrDicHandle, // 辞書ハンドル ldicHandle = jocrLDicHandle, // 言語辞書ハンドル certainty = (short)charOpt.TypeCp, // 確信度 }; } else { // 認識字体が手書き jocrEnv = null; } // 手書き認識用環境の設定 DoOcrSDKHocrEnvHandle hocrEnv; if ((mode & RcFontType.HOCR) == RcFontType.HOCR) { // 認識字体が手書きか両方 // ライブラリハンドル DoOcrSDKHocrLibHandle hocrLibHandle = new DoOcrSDKHocrLibHandle() { pLibHandle = this.Env.hocrLibHandle.pLibHandle, }; // 辞書ハンドル DoOcrSDKHocrHandle hocrDicHandle = new DoOcrSDKHocrHandle() { handle = this.Env.hocrPatDictHandle.handle, }; hocrEnv = new DoOcrSDKHocrEnvHandle() { libHandle = hocrLibHandle, // ライブラリハンドル dicHandle = hocrDicHandle, // 辞書ハンドル certainty_ank = (short)charOpt.HwCpANK, // 確信度(ANK)のしきい値 certainty_kana = (short)charOpt.HwCpKanaKanji, // 確信度(かな)のしきい値 }; } else { // 認識字体が活字 hocrEnv = null; } // 認識対象領域情報の設定(項目画像のため画像全体だが、ピッタリだとDoOCRがうまく動かないため) DoOcrSDKArea area = transArea.GetCharArea(); // 認識実行パラメータの設定 DoOcrSDKNoiseSize noiseSize = new DoOcrSDKNoiseSize() { minWidth = 0, // 有効な矩形の最小幅 minHeight = 0, // 有効な矩形の最小高さ maxWidth = short.MaxValue, // 有効な矩形の最大幅 maxHeight = short.MaxValue, // 有効な矩形の最大高さ }; DoOcrSDKItemMargin itemMargin = new DoOcrSDKItemMargin() { left = 0, top = 0, right = 0, bottom = 0, }; DoOcrSDKOcrParam param = new DoOcrSDKOcrParam() { line_dir = DoOcrSDKDirection.LANDSCAPE, // 行方向 char_dir = DoOcrSDKCharDirection.NORTH, // 文字方向 char_type = createDoOcrCharType(charOpt), // 認識対象文字種 symbol_flag = createDoOcrSymbolFlag(charOpt), // 記号認識有無フラグ dilation_flag = 0, // 手書き文字太らせフラグ(未使用) onechar_flag = (short)(charOpt.RcDigit == 1 ? 1 : 0), // 一画認識フラグ(未使用) form = charOpt.RcForm, // 認識フォーム noise_size = noiseSize, // ノイズ除去サイズ(別途行っているためここでは不要) item_margin = itemMargin, // マージン情報(未使用) }; List <DoOcrSDKResult> resultList = new List <DoOcrSDKResult>(); // 活字OCR1行認識の実行 // 例外処理は一つ上で処理させるため、ここではtry-catchは使用しない resultList = doOcrSdk.DoOcrExecute(jocrEnv, hocrEnv, image, area, param, Convert.ToSByte(charOpt.RcDigit)); // 指定した文字数分だけ結果を残す // this.deleteResultByOutofRcDigit(resultList, Convert.ToInt32(ocrExecItem.RcDigit)); return(new DoOcrExceuteResult(resultList)); }