Trackingサンプル

みなさま、ご挨拶もなしに新年から半月以上経過してしまいました。今年は無理せず適当に書いて行こうと思っていたら、この体たらくです。
まあ、何はともあれ寒いです。鼻水がたれそうです。本当はおうちから出たくはありません。気分的には冬眠しちゃいたいくらい寒いのが苦手です。と言う事で今年も適当にお付き合い頂ければうれしいです。
タイトルはトラッキングですが、何をトラックするかというと「お顔」なんですね。年末の脳内バグっている状態のとき、くだらないスクリプトが書きたいと呟いてしまったのが始まりです。結局それなりに規模が大きくなってしまったのは毎度の事ですが、この顔認識というのは結構使えそうだったりするのがなんとも…
それと、今回は手抜きをします。年末から評価していたOpenCVのライブラリがとても扱いやすく、自前での実装をやる気が失せたと言う事なのですが、なかなか良い感じなのでよしとしましょう。
という事なので、今回はわたしの所からブツを落とすだけでは動きません。続きをクリックして冒頭のフレームワークを予め導入して下さいta
それと、今回はMacのみです。近いうちにWinな人向けのダイナミックライブラリも作ろうと思うので、暫しお待ち下さい。

必須フレームワーク:OpenCV.framework
http://vislab.cs.vt.edu/~vislab/wiki/index.php?title=VisionよりOpenCV2.0.dmgをダウンロードしOpenCV.frameworkを導入してください。(dmgをダブルクリックで開きframeworkをエイリアスにドロップするだけでOKです。)

次にfaceDetecter.frameworkを当ページの下部のリンクよりダウンロードします。こちらはExtendScriptより呼び出すだけなので、どこに置いておいても問題ありません。
エクスターナルオブジェクトの呼び出し方はサンプルスクリプトをご覧下さい。内包するメソッドはtrackFace()メソッド1本です。引数として、対象ファイルのパス及びトラッキングに必要なカスケードファイルのパスが必要です。このカスケードファイルを変更する事により横顔の検出等に切り替える事が出来ます。又、人間以外の構造や特徴的画像をトラックする事も出来ます。返り値は配列として返されます。トラックされた部分が1ヶ所の場合、左上の(x,y)座標、width、heightの4つの数値が帰ります。複数の場合、この順序で4つのデータが1組で繰り返しになりますが、切れ目はありません。頭から4つずつ数えて下さい。トラックされない場合及びファイルが読込めない場合はエラーがスローされますのでエラーコレクトは確実に行って下さい。

var tgt = app.activeDocument.selection[0];
var bx = tgt.geometricBounds;
var f = File.openDialog (“select a file…”);
var fnm = f.fsName;
tgt.place(f);
var bnds = tgt.graphics[0].geometricBounds;
var dpi = tgt.graphics[0].actualPpi[0];
var wth =  (bnds[3] – bnds[1]) ;
var hgt =  (bnds[2] – bnds[0]) ;

var cascade = “/faceDetecter/haarcascades/haarcascade_frontalface_alt.xml”;
try{
    var extObj = new ExternalObject(“lib:/faceDetecter.framework”);
    var pos = extObj.trackFace(fnm, cascade);
    extObj.unload();

    var wd = bx[1] – bx[3];
    var pw = pos[2] * 1.6 / dpi * 25.4;
    var ph = pos[3] * 2 / dpi * 25.4;
    var scale = wd / pw;
    var ctr = [(pos[0]+pos[2]/2)/dpi*25.4,
                (pos[1]+pos[3]/2)/dpi*25.4];

    var x = ( ctr[0] – pw/2 ) * scale;
    var y = ctr[1] * scale – ( bx[0] – bx[2] ) * 0.6;
    var imgWd = wth * scale;
    var imgHgt = hgt * scale;

    tgt.graphics[0].geometricBounds = [
        y-imgHgt+bx[0],
        x-imgWd+bx[1],
        y+bx[0],
        x+bx[1]
        ];
    }catch(e){
        alert(“error occured…”);
        }

サンプルスクリプトはIndesignでの利用例です。

この様にrectangleを一つ選んでおきます。
スクリプトを走らせるとファイル選択ダイアログが開きますのでファイルを選択しましょう。

faceDetecterによりお顔の位置が返され、リサイズと位置調整が自動で行われました。

もう一つやってみます。

結果はこんな感じに。いずれも良い感じに配置されましたとさ。


配置された画像はこんなのです。

参考までに、テストで作成したfaceTracker.appと言うのがあるのですが、こいつを通すと上のように四角い領域が描画されます。faceDetecter.frameworkはこの領域を数値で返すライブラリです。

最後にこちらのファイルをダウンロードして下さい。

faceDetecter.framework.zip

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする