2016/08/11 追記
Java アプレットと自宅サーバが滅びたので、Android アプリとして作り直しました。
https://play.google.com/store/apps/details?id=io.github.mame.flagir
国旗を描いて検索するアプレットです。国際競技の観戦などのお供にどうぞ。
ref: http://dame.dyndns.org/misc/flagir/
思った国旗がうまく出ないときは色が微妙に間違ってる可能性があります。明るい青とか暗い青とか変えて試行錯誤してみてください。細かい形は見ていないので、その辺にこだわってもたぶんダメです。
アルゴリズム
飛廉さんに聞いただけのにわか知識。
- 画像を 3x3 分割 *1 して、それぞれの位置を RGB ごとにヒストグラム *2 を作る。
- 手書き画像と各国旗画像のヒストグラムの Bhattacharyya 距離を計算し、短いもののトップ 10 を決める *3 。
各国旗の画像のヒストグラムは jar の中に入れてあるので、全部ブラウザ側だけで計算しています。よってサーバの負荷にはならない。
ソースコードは github にあります。コメントください。
ref: http://github.com/mame/flagir/
Scala の感想
Scala の習作として作りました。Scala よかったなと思うところを挙げると
- 型チェックのおかげで Array[Array[Array[Int] ] ] みたいな型を扱ってもバグが入りにくい。
- 処理速度がだいぶ速い。(Ruby に比べて)
- ブラウザで動くものが書ける。
- ストレスなくプログラムが書ける。(Ruby と比べればまだまだいまいちだけど、Java と比べたら天と地の差)
という感じ。
まあ、文法に落とし穴があるとか、型推論弱すぎとか、やっぱりコンパイル遅すぎとか、ライブラリ貧弱すぎとか、オブジェクト作るとみるみる遅くなるとか、要するに Java クソ食らえとか、不満もいっぱいあるにはある。こっちはそのうち別のエントリとしてまとめたい。
言語は使いどころ次第ですよね。日常は Ruby で、特定の状況では Scala を使うようになるかも。