切り取った画像を加工して、Tesseractで手順番号を検出します。
- 周囲の白を黒で埋める。matw:一つの石を切り取った画像
周囲の白を黒で埋める処理 (Loop処理) 123456789101112for (int y = 0; y < h; y++)
{
for (int x = 0; x < w / 2; x++)
{
if (!setBlack2Mat(matw, x, y)) break;
}
for (int x = w - 1; x > w / 2; x--)
{
if (!setBlack2Mat(matw, x, y)) break;
}
}
h :matwの高さ
w :matwの幅
切り取った画像の、左側・右側それぞれ 中央に向かい、関数 setBlack2Mat を使って、黒ピクセルが見つかるまで白ピクセルを黒に変更します。白を黒で置き換える関数 1234567891011121314151617181920private Boolean setBlack2Mat(Mat matw, int x, int y)
{
var pix = matw.Get<vec3b>(y, x);
int b = pix[0];
int g = pix[1];
int r = pix[2];
if (!(r == 0 && g == 0 && b == 0) || x == 0 || y == 0)
{
pix[0] = 0;
pix[1] = 0;
pix[2] = 0;
matw.Set<vec3b>(y, x, pix);
return true;
}
else
{
return false;
}
}
この処理で、文字部分のみ残し黒で埋められます。
- 文字検出処理
周囲の白を黒で埋めた後、文字検出処理を実行します。matw :1.の処理で周囲の白を黒で埋めたMat文字検出 1234567891011121314//黒四角を判定
if (Cv2.CountNonZero(matw) < 5) return "--";
//tesseract用のbitmapを準備する
Bitmap bitmap = matw.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();
return str.Trim();
このMatに 黒(0,0,0)以外のピクセルが4以下の場合、黒四角とみなし手順番号無し("--")を返します。
以外、OCRを行うオブジェクト tesseractを生成し、数字のみ検出します。
この状態で、文字を検出した結果を見ると 以下のようになります。
【元の画像】
【検出結果を電子碁盤用に表示した結果】 (8,16) (9,16) (10,13) (11,15)の石の文字が認識できず ”??”と表示されています。 - 周囲を黒マージンで囲んだ後文字検出
周囲を黒マージンで囲んだ後文字検出 123456789101112131415161718192021//黒四角を判定
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();
return str.Trim();
周囲に黒マージンを加えたことにより、2.で検出不能だった石の手順番号が検出できました。
開発環境
OS:Windows10
言語:C#(WPF使用)
IDE:VisualStudio2019
仕様Tool:OpenCvSharp v4.0.0.20181129
Tesseract v3.3.0.0
使用電子本:電子書店パピレスのNHK 囲碁講座 テキスト
OS:Windows10
言語:C#(WPF使用)
IDE:VisualStudio2019
仕様Tool:OpenCvSharp v4.0.0.20181129
Tesseract v3.3.0.0
使用電子本:電子書店パピレスのNHK 囲碁講座 テキスト
0 件のコメント:
コメントを投稿