2019年11月10日日曜日

棋譜OCRプログラムの軌跡(3)縦線・横線の座標を求める

碁盤には、縦横19本の線が引かれていて 白黒の石はその交点に打たれます。電子本から取り込んだ棋譜図の例を下に示します。


x座標は、左から右に1~19 y座標は、上から下に1~19で表します。
日曜のお昼Eテレの囲碁講座などで、読み上げられている「白11・8」は上図の54と書いてある 白石の位置です。(Y座標は、漢数字で書くのが正式らしいです。)
ここで54と書いてある数字が手順番号で、石を打った順番を示しています。なお上図には手順番号39~82の石が記載されており、手順番号が記載されていない石は、手順39以前に打った石です。

棋譜アーカイバーを作る手順は、次の手順で行いました。
  1. 座標のもとになる輪郭の縦線・横線を求める
  2. 石の座標を求める
  3. それぞれの石の手順番号を求める

【縦線・横線を求める】

縦線・横線は、OpenCvのハフ変換を使って求めました。(Cv2はOpenCvSharpのクラスです)

            Mat gray = new Mat();   //モノクロ画像を入れためのMat
            Cv2.CvtColor(src, gray, ColorConversionCodes.BGRA2GRAY);

            Mat edges = new Mat();  //輪郭を入れるためのMat
            Cv2.Canny(gray, edges, 100, 200);

            LineSegmentPolar[] lines = Cv2.HoughLines(edges, 1, 3.14159 / 180, 180);

取り込んだ画像(src) → モノクロ画像(gray) → 輪郭の画像(edges) → 直線の配列(lines:極座標形式)
の手順で直線を検出しました。検出した直線を図示すると下図のようになります。


図から分かるように、縦線・横線以外に石の接戦も直線として認識していることが分かります。これはHoughLinesの引数を調整することにより除去することが可能です。
直線の起点の座標を(x1,y1) 終点の座標を(x2,y2)としたとき、
 長さが元画像の90%を超えている かつ |x1 - x2|≦ 1 または |y1 - y2|≦ 1
の直線のみを表示すると下図のようになります。


直線が太く見えるのは、縦線・横線の輪郭を取りそこから直線部を検出しているため、2本ずつ検出されているためです。

次に、縦軸のx座標の最大値・最小値 および 横軸のy座標の最大値・最小値を求め図示すると次のように、きれいに盤面の輪郭が求められました。


参考にしたサイト
ハフ変換による直線検出 



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

0 件のコメント:

コメントを投稿