課題内容 数字の1から9を認識するプログラムを書け! (keyword : 画像解析の課題)
○JAVAのApplet上で文字を書けるようにする ○端を認識する ○リスト化する ○曲がっているところ。急な方向転換。ほぼ真直ぐを認識する。 ○おのおののパターン表を記憶する 〜 ○実際に動かしてみる 〜 いろいろ 試すとうまくいく事があります。 ○提出案件 〜 私の限界です。とても眠いです ○感想 〜 嘆き ○詳細 〜 アルゴリズムの解説 リファレンスは私の頭の中とJAVAドクでした
Applet上でドラックしながらマウスを動かすことで数字を入力することが出来ます。 書いた数字が 1から9までのどの数字であるかを、リストボックス上で指定したアト。 "学習"と書かれたボタンを押すと、アプレット上に書かれた数字を覚えます。 以後 "答える"ボタンを押すと、アプレット上に書かれた数字がどの数字であるかを 返します。 学習回数を増やせば増やすほど、頭が良くなります。 ( 注意 4などの特殊な文字を除いて一筆書きで書かれることをお勧めします。 一筆でかかれたと思われるところを青く変化するようになって降ります。 出来る限り青く変化するようにしてください。 学習の効率が上がります ) ( お知らせ 下から書いても、 端っこに書いても 斜めから書いても関係ないように 設計されています。 )
文字を書くソフトを作成します。本プロセスは数値入力を 効率かつ効果的に行うために作成しました。 ペイントソフトのペンツールのようにマウスの軌跡を画面 上に描画します。 本プログラムはJavaを用いています。javaではMouseMotionListenerを用いて マウスが移動した時のマウスの位置を知ることが出来ます。 しかし、MouseMotionListenerが返すタイミングでは、移動した軌跡を捉えることが 出来ません。うまく文字を描くことが困難わけです。 そこで、点と点の間に線をひき、間を保管することにしました。
いろいろ考えられますが 私が用いた方法はArrayImageのdrawLineに書かれています。 あまり良くないですが
文字の始まりと終りを認識します。 数字の2の場合赤いまるでかかれたところを端と命名しました。ここまでの成果
端を認識することが出来るようになりましたので。 端から端までの位置を記憶します。 そして、それらは、次の章ではベクトルの変化に応じて 角張っている。曲がっている 。ほぼ真直ぐとうの パターン情報へと変換していきます。 ( 交点の存在があるので、うまく位置をリスト化するにもベクトル情報必要になります・) ベクトル情報の無いもの temp = nominateNext(); if(temp == null){System.out.println("earch lost");return;} while(temp != null && temp.size()!= 0) { root.add(temp.get(0)); temp = nominateNext(); } ○ベクトルについて。 点と点の間を密にとると、ベクトルの変化がはげしくなります。 点と点の間はそこそこある方が良いというわけです。 しかも。それは 大きさに依存します。 かくして 数字の大きさ * u となりますが、 数字の多きかさを無視したバージョンを 今回は用います 。 5点先くらいがベストかも知れません。
端が見を見つけることが出来ましたので、端から端までの 移動ベクトルを取っていきます。 急な変化があったときは角張っている。 少しずつなら曲がっている。 ほぼ変化が見られないのであれば真直ぐである。 という感じ。これまでの成果
まずはリストの数を比較する。 次はリストの曲がり具合を比較する 次はリストの真っ直ぐの数を比較する 統計量から比較する という具合に 対象を絞る計算を繰り返す。 残ったものを出力する。作りかけ
提出用 さらに、角張っているところからのベクトルのXORを追加
アプレットです。 JDK1.5対応です。 機能を確認できます ソース
最終課題を見下しすぎていた。 もっと早くから手を伝いれば、 3週間頂いて結局一夜漬けでした 一夜漬けの限界を感じた最終課題でした。 まず、ソースがアレに荒れたこと、すさまじい異なっています。 構築しなおす心の余力がありませんでした。残念です。 ひとつ Databaseクラスのsearchメソッドの酷さは見るも無残です。 特定のパターンが続いています。 私はコピーアンドペーストで しのぎましたが、 重複する部分をインターフェイスを定義してあげるなどの対策が練れるでしょう。 ひとつ はねる や 曲がる や まっずくの を決める ベクトルの変化量は 私が何度も繰り返して値を決めましたが、敷居値を学習させることも出来たはずです。 ひとつ まだまだありますが、これでおわります。
実際に行ったこて
端を認識する ↓ 端から端までの位置情報を記録する ↓ 端から端までのベクトル情報を記録する ↓ ベクトル情報から角度を計算する ↓ 角度から曲がっているのか、角張っているのか 真っ直ぐなのかを調べる ↓ →学習ボタンを押される ↓ 端から端までのデータと どの数字かのデータを保存する ↓ →答えるボタンを押すと ↓ 端の数が同じものをピックアップ ↓ 角張っている数が同じものをピックアップ ↓ 真っ直ぐかどうかをピックアップ ↓ 曲がっているかどうかをピックアップ ↓ 残ったもので数が多いものを残すクラスの説明
Mametan : 端から端までの位置情報とベクトル情報を探索保持する Pattern : 端を探す Data : Mametanと数字を関連ずけて保持する DataBase : Dataをたくさん保持する 検索したりする ArrayImage : 画像を保持する ExeInput : プログラムの本体。
テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル