2019年11月19日火曜日

棋譜OCRプログラムの軌跡(4-4)手順番号検出(数字一桁対策)

前回までで、一応黒石・白石の手順番号が取得できるようになりました。しかし、今までの方法では、一桁の数字は認識できませんでした。このことは、多くの方が述べておられます。
【元の画像】
【解析結果】
一桁の数字は、全く検出できていません。

ググると、Pythonでの対策方法が載っていて、configパラメータで指定するとのこと。それを参考に、ConfigFileを作成してみましたが、 -psm なんてパラメータはないよ!! と 異常終了してしまいました。
あきらめかけたのですが、ようやく Stack overflow に1文字対応の方法を見つけました。


【一文字に対応した 文字検出処理】

以前投稿した、黒石の手順番号検出処理を以下のように変更しました。

        //黒四角を判定
        if (Cv2.CountNonZero(matw) < 5)  return "--";
        
        //縦横3倍のMatを準備する
        Mat mat = new Mat(matw.Width * 3, matw.Height * 3, MatType.CV_8UC1, Scalar.Black);
            
        //中央に貼り付け
        var rect = new OpenCvSharp.Rect(matw.Width, matw.Height, matw.Width, matw.Height);
        mat[rect] = matw;
            
        //tesseract用のbitmapを準備する
        Bitmap bitmap = mat.ToBitmap();

        //  言語データの場所と言語名を引数で指定する
        var tesseract = new Tesseract.TesseractEngine(@"C:\temp\tessdata", "eng");
        tesseract.SetVariable("tessedit_char_whitelist", "1234567890");

        // OCRの実行
        Tesseract.Page page = tesseract.Process(bitmap);
        string str = page.GetText();

        // 1文字対応
        if (str == "")
        {
            page.Dispose();    // Disposeしないとエラーになる
            
            // ページモードに1文字を設定する
            Tesseract.Page pg = tesseract.Process(bitmap, Tesseract.PageSegMode.SingleChar);
            str = pg.GetText();
        }

        return str.Trim();

【一文字対応処理を施した結果】

一桁の数字も認識できるようになりました。



参考にしたサイト
Python + pyocr で ocr したら高認識率で1桁数字も認識した 
Python - Pytesseractで画像内の数字を読む
Tesseract.Net parameters
ここまで実装できなかったConfig関連  残念!!

実際に実装したのは
How to set Tesseract 2 to read a SINGLE char in C#?



開発環境
 OS:Windows10
 言語:C#(WPF使用)
 IDE:VisualStudio2019
 仕様Tool:OpenCvSharp v4.0.0.20181129
      Tesseract v3.3.0.0
 使用電子本:電子書店パピレスのNHK 囲碁講座 テキスト

0 件のコメント:

コメントを投稿