Imager::AnimeFaceをRubyから使えるようにしました

Perlでアニメ顔を検出&解析するImager::AnimeFace
http://d.hatena.ne.jp/ultraist/20090412/1239497216

このライブラリをRubyから呼べるようにしました。Mac OS X Leopard で動作確認してます。

使い方

動作にはnvxsとRMagickが必要です。

下のアドレスからファイルをとってきて、
http://oblgt.es.land.to/src/AnimeFace-Ruby.zip

 % ruby extconf.rb
 % make

してください。
うまくmakeできないときは、extconf.rbをいじるといいかもしれません。


makeがうまくいくとAnimeFace.*ができています。
あとはアニメ顔検出をしたいRubyプログラムで

require "pp"
require "rubygems"
require "RMagick"
require "AnimeFace"

def anime_detect(imagelist, window = 42.592, step = 4.0, scale_factor = 1.095)
    AnimeFace::detect(imagelist, window, step, scale_factor)
end

image = Magick::ImageList.new("test.jpg")
result = anime_detect(image)

pp result

とでもやれば、こんな風に結果が返ってきます。

[{"face"=>{"x"=>326, "y"=>104, "height"=>170, "width"=>170},
  "skin_color"=>{"green"=>242, "blue"=>235, "red"=>252},
  "likelihood"=>0.999998152256012,
  "eyes"=>
   {"left"=>
     {"x"=>436,
      "y"=>146,
      "height"=>55,
      "colors"=>{"green"=>30, "blue"=>67, "red"=>68},
      "width"=>50},
    "right"=>
     {"x"=>340,
      "y"=>132,
      "height"=>55,
      "colors"=>{"green"=>21, "blue"=>43, "red"=>64},
      "width"=>52}},
  "hair_color"=>{"green"=>90, "blue"=>104, "red"=>190},
  "nose"=>{"x"=>407, "y"=>203},
  "chin"=>{"x"=>398, "y"=>257}}]

AnimeFace::detect

この関数はアニメ顔の検出を行って結果を返します。得られる値はハッシュの配列です。
引数はImager::AnimaFaceとほぼ同じですが、第一引数はImagerのインスタンスではなくMagick::ImageListのインスタンスにしてください。

ライセンス

NYSLです。

言い訳

(Perl版に比べて)遅いです。ImageListのインスタンスからPixelの配列を取り出す→各PixelからRGB値をメソッド経由で呼び出す、なんてことをやってるからかもしれません。
問題があれば連絡ください。

感想

NYSLだとこういう少し置換しただけのライブラリがすぐ作れたり、すぐ配布できたり、ゆるくてうれしい。