flagir: 国旗手書き検索


2016/08/11 追記
Java アプレット自宅サーバが滅びたので、Android アプリとして作り直しました。

https://play.google.com/store/apps/details?id=io.github.mame.flagir

国旗を描いて検索するアプレットです。国際競技の観戦などのお供にどうぞ。
ref: http://dame.dyndns.org/misc/flagir/

スクリーンショット


思った国旗がうまく出ないときは色が微妙に間違ってる可能性があります。明るい青とか暗い青とか変えて試行錯誤してみてください。細かい形は見ていないので、その辺にこだわってもたぶんダメです。

アルゴリズム

飛廉さんに聞いただけのにわか知識。

各国旗の画像のヒストグラムは jar の中に入れてあるので、全部ブラウザ側だけで計算しています。よってサーバの負荷にはならない。
ソースコードgithub にあります。コメントください。
ref: http://github.com/mame/flagir/

Scala の感想

Scala の習作として作りました。Scala よかったなと思うところを挙げると

  • 型チェックのおかげで Array[Array[Array[Int] ] ] みたいな型を扱ってもバグが入りにくい。
  • 処理速度がだいぶ速い。(Ruby に比べて)
  • ブラウザで動くものが書ける。
  • ストレスなくプログラムが書ける。(Ruby と比べればまだまだいまいちだけど、Java と比べたら天と地の差)

という感じ。
まあ、文法に落とし穴があるとか、型推論弱すぎとか、やっぱりコンパイル遅すぎとか、ライブラリ貧弱すぎとか、オブジェクト作るとみるみる遅くなるとか、要するに Java クソ食らえとか、不満もいっぱいあるにはある。こっちはそのうち別のエントリとしてまとめたい。
言語は使いどころ次第ですよね。日常は Ruby で、特定の状況では Scala を使うようになるかも。

裏話

オリンピックとかで国旗の映像だけ見て、「これなんて国だっけ」と思っても調べにくいなあ、という経験が何回かあったので、国旗画像検索は前から作りたかったものでした。でも画像検索のエンジンでフリーでそれなりの精度が出るやつって見つかりませんでした。Ruby は画像を扱うのが鬼門 *4 なので、なかなかやる気もしなかった。

で、まあこれが完成して、ドイツの国旗でも試してみるかと思ったけど、色の順番がわからなかったので先に調べるはめに。アメリカの国旗は最初赤と青を逆に描いてた。うーん、うろ覚え。

*1:正確には 4x4 分割して、2x2 の塊を 1 つのゾーンとして扱った。重複させれば位置のずれに少しは寛容になるかなと。

*2:明るい、中くらい、暗い、の 3 段階に分けて棒グラフみたいにする。これも多少重複させてる。

*3:OpenCV のヒストグラムのサンプルをちょっとだけ参考にした。

*4:イテレートが遅いのでピクセルごとの処理とかがかなり遅い。あと定番の画像読み書きライブラリがない (個人的には cairo がおすすめ、依存性に問題がなければ) 。