【python】手書き線を認識し、整える

2020 3/10
【python】手書き線を認識し、整える

今日は手書きされた図面を、pythonを使用して直線の認識、整理を行い、きっちり並べる手法を紹介します。

digi_fig_1.png

手書き図が少し曲がっていても、線の繋ぎが甘くても、それを整えて右図のようにxy軸に平行できっちりした図に変換します。もちろん各直線の始点終点の座標も出力可能です。

目次

概要: 直線の取得 → 軸平行処理 → 重複線処理 → 端点処理

今回のプログラムの概要を図にしましました。

digi_fig_2

上図には処理内容の説明と共に下記で紹介するコード内の関数名も同時に記載しました。

  1. openCVを利用した直線検出(ハフ変換手法)でまずは直線を検出
  2. 手書き線画太かったりすると、同じ線が2本認識されてしまうことがあるので、この重なりを解消
  3. 全ての線をxy軸に平行になるように整える
  4. 1つの直線が2本に切れて認識されることもあるので、これを統合された1つの直線にする
  5. 最後に各直線の端点(始点or終点)を他の直線の端点と一致させる

ソースコードは、メイン関数(digi_conv_main)が、サブ関数(read_lines, para, fusion, coordinate)を順番に呼ぶ構造になっています。最後にplot_lines関数を何回か呼び出し、中間処理結果も含めたグラフ化を行っています。

サブ関数read_linesとfusionは、さらにそれぞれintegrate_lines、fusion_linesを呼び出すようになっています。

以後の説明はpythonのソースコード内で示していきます。

メイン関数(digi_conv_main)

コード内の「&lt;」は「<」と置き換えてください。

直線検出(認識)関数(read_lines + integrate_lines)

コード内の「&lt;」は「<」と置き換えてください。

直線をxy軸対して平行にする関数(para)

コード内の「&lt;」は「<」と置き換えてください。

同一直線の結合を行う関数(fusion)

コード内の「&lt;」は「<」と置き換えてください。

直線の端点(始点終点)を一致させる関数(coodinate)

コード内の「&lt;」は「<」と置き換えてください。

plotを行う関数(plot_lines)

コード内の「&lt;」は「<」と置き換えてください。

全てを1つのpythonファイルに書いた場合(コピペ実行可能)

ここでは上記で紹介した関数を1つのファイルに書き、実行できる形を示します。

コード内の「&lt;」は「<」と置き換えてください。

入力する図の例も残しておきますので、これで試験していただければ下記と同じような結果が得られるはず!

input_fig.png
input_fig.png

実行結果例

ここに実行結果の例を示したいと思います。

途中経過の図も示しておきます。

digi_fig_3

処理された最終的な結果の直線群はdigi_conv_main関数内のcoor_linesの中に座標が格納されていますのでいくらでもデータ処理ができます。

これで手書きされた図面も整えて、好きなようにデータ処理ができます!

関連記事

応援よろしくお願いします☆

この記事を書いた人

天文の博士号をもつ理系パパ。
3歳の娘を子育て中。
最近はダイエットに挑戦中!

コメント

コメントする

目次
閉じる