2019年11月19日火曜日

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

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

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


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

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

一文字対応 文字検出処理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//黒四角を判定
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 件のコメント:

コメントを投稿