パズルゲーム「カラフルフロア」をスリム化

 顔検出はサボり気味です。

 プログラムを足すのには時間がないので、引く作業をメインにしていました。
 パズルゲーム「カラフルフロア」のメニュー画面のアニメーションを引き、「おすすめアプリ」広告を引き、画面キャプチャー機能を引いてスリム化。
device-2014-12-21-134039
 とは言え、近いうちにエディット画面を足そうと考えているので、その準備でもあるわけです。
 
 今は、内部で管理しているステージデータ、例えば

3040409006409002609002356090001000359002609002549002540
0200000547000403590011000100000605000700010000070900300

を外部出力用に

(Da?D23ITO7T37<MT9c2E284W1b7OIT781JdMmBa)0p2FD2E0g5

と圧縮する部分を考えています。

 ブロックソートをかけ、MoveToFront と ランレングス を施し、内部辞書で置き換えまでしているというデータ長の割には重厚な処理です。
 その結果が、前の例なので無駄な処理をしてるっぽい。
 もっとシンプルに圧縮できそうですね。
   
 ic_launcher-web

まだやってる

 まだ顔検出やってます。
 政治家チーム51名とAKBチーム44名の顔写真で検証中です。

 瞳検出のみでの成績は・・、
 
 成功例
000 他
 失敗例
009 AKBチーム9名

010 政治家チーム8名
 82%の検出率です。
 口元と頬の検出も始めました。が、まだまだ。
 
 並行して別のアプローチを考えてみようかしらん。

AKBに玉砕

 顔検出を AKB の面々に試したところ、20人近くが誤認識と玉砕でした。

 茶髪だったり、顔傾けていたり、帽子被っていたりで強敵揃いです。
 なんとか突破口を見つけたい。

 でも、試す画像も増えてきて、いちいち Android アプリを起動するのが面倒なのですね。メモリリークも起こしているようで強制終了することもありますし。

 そこで、Android アプリを捨て Java アプリケーションで検証し始めました。
faces
 まずは、変換画像の一覧をば。

 左上から元画像、モザイク画像、64色モザイク画像、赤成分精細64色モザイク画像
グレースケール・モザイク画像、16階調グレースケール・モザイク画像、4階調グレースケール・モザイク画像、白黒モザイク画像
赤成分モザイク画像、16階調赤成分モザイク画像、4階調赤成分モザイク画像、2階調赤成分モザイク画像でございます。
 
 まだまだ、まだ続く。

顔検出を仕切り直し

 もうアプリの完成なんて眼目にもなく、顔(パーツ)検出に集中しています。
 
 前回、総理に眼鏡ヒゲを付けさせていただいたのですが、全般的に検出率が悪いのですね。7割そこそこといったところ。
 
 モザイクにして16階調モノスケールにしていたのですが、256階調にしても計算量は変わらない。
 戻したところ、ちょっと検出率向上。
 
 また、試しにRGB成分ごとに検出してみたらR>G>Bの順に差が出たので、グレースケール化の

color = (int)(r*0.298912 + g*0.586611 + b*0.114478);

color = (int)(r*(0.298912+0.3) + g*(0.586611-0.2) + b*(0.114478-0.1));

に変更。+0.3、-0.2、-0.1 の補正値は適当です。
 これが、こう変わりました。美白化ですね(赤味を強くした)。
device-2015-02-28-165702 device-2015-02-28-165808
ちょっと検出率向上。
 
 でも、顔が大き過ぎたり小さ過ぎたり、上過ぎたり下過ぎたりで、検出率には限界があるのですね。
 
 仕切り直ししました。
 
 はじめに顔の位置や大きさを知りたいので、R成分を抜き出してみる。

color = r*2 – g – b;
if(color < 0) color = 0; この値をRGBに入れるので、黒白グレーなど赤くない色は、黒くなるといった次第。 device-2015-02-28-165934
 気持ち悪いけど、こうなります。
 
 このままでは処理しにくいので、4階調にして

color = ((int)(color/64f))*64;

 更に、上3階調分を白くして2階調にしちゃう。

if(color > 0) color = 255;
device-2015-02-28-170046 device-2015-02-28-170141

 この画像を使って位置と大きさを求めるのですが、白黒の境を走査してもゴミも拾っちゃいそうだったので、とても好きなモンテカルロ法を導入。

 画面上に適当に 2000 発の点を打ち込み、その場所が「白」ならば上下左右に走査し「黒」になったらマークします。
 最後に上下左右端から走査して、規定値(10マーク)以上のラインを顔の位置としたものです。
 耳の端っことか、背景の赤部分を拾い難くしたわけですね。
 
 更に、検出した顔エリアの横中央付近で一番明るいラインを いろいろやって(省略)検出してみました。

 そのラインを基に瞳検出器を当てた結果が次のとおりです(R成分画像に重ねてみました。気持ち悪い画像が続きますがご容赦を。中央縦ラインは、瞳検出後にその中間点に引いた線なので、あまり意味がありません)。

 まずは、合格者から
ok1
ok2
 副大臣たちも参加し
ok3
ok4
 44名合格です。

 そして、残念ながらの不合格者は
ng
 8名。コワい大統領が入ってしまったのが悔やまれます。

 検出率 約 84 %です。良くはなりました。
 この内4名は、顔エリアの中央に瞳が検出されてしまったケースなので拾い上げて補正できそうかな。

 おじさん顔に相当にフィッティングしてしまったとも思われるので、女子のサンプルも加えつつ、まだまだ続きます。

 今宵はジンフィズを嗜んでいるので、これまで。

( 灬 ) を付ける

 瞳検出と口元検出の後に鼻筋検出して、その結果から瞳位置を補正し、再度口元検出したところ、総理の目や口も正しく捉えることができたので、鼻検出も加えて円眼鏡とちょび髭を付けてみました。
device-2015-02-23-003908
 サザンのアルバム発売を前に大晦日の話題を蒸し返すつもりはございません。
 
 眼鏡の傾きも計算して考慮しています。
 髭は、AndEngine の Particle システムを使っていますが、思い通りに生えてくれない・・。
 第一、ズレてるしなぁ。