日曜のお昼Eテレの囲碁講座などで、読み上げられている「白11・8」は上図の54と書いてある 白石の位置です。(Y座標は、漢数字で書くのが正式らしいです。)
ここで54と書いてある数字が手順番号で、石を打った順番を示しています。なお上図には手順番号39~82の石が記載されており、手順番号が記載されていない石は、手順39以前に打った石です。
棋譜アーカイバーを作る手順は、次の手順で行いました。
- 座標のもとになる輪郭の縦線・横線を求める
- 石の座標を求める
- それぞれの石の手順番号を求める
【縦線・横線を求める】
縦線・横線は、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 囲碁講座 テキスト
OS:Windows10
言語:C#(WPF使用)
IDE:VisualStudio2019
仕様Tool:OpenCvSharp v4.0.0.20181129
Tesseract v3.3.0.0
使用電子本:電子書店パピレスのNHK 囲碁講座 テキスト
0 件のコメント:
コメントを投稿