SATCHを使ってお顔のパーツを複数(並列)トラッキング
カスケードは、OpenCVのhaarcascade_mcs_lefteye.xml(左目)とhaarcascade_frontalface_alt2.xml(顔)の2つを使用。
zzz
ベースは、サンプルのTESTSにある「testFaceTrackingAutoinit」です。
ただし、facetrackerAutoinitフォルダーにあるトラッキングファイル(testFaceTrackingAutoinit_mask.obj,testFaceTrackingAutoinit_tracker.xml)
は削除して、一から作り直します。
トラッキング時に表示する3Dオブジェクトは、Total Immersionのサイトにある素材(ti_torus)を使いますので、mediaフォルダーのファイルも削除しておきます。
まず、2つのトラッキングを行うので、表示用3Dオブジェクトも2つ用意します。
3Dオブジェクト
ti_torusの3つのファイルを名前を変更して、2種類用意します。
ti_torus.scene -> ti_torus1.scene,ti_torus2.scene
ti_torus.material -> ti_torus1.material,ti_torus2.material
ti_torus_Torus_mesh.mesh -> ti_torus_Torus_mesh1.mesh,ti_torus_Torus_mesh2.mesh
ti_torus1.sceneとti_torus2.sceneを開いて、名前の部分を書き換えます。
これらのファイルをmediaフォルダーにコピー
OpenCVのhaarcascade_mcs_lefteye.xml(左目)とhaarcascade_frontalface_alt2.xml(顔)をfacetrackerAutoinitフォルダーにコピー。
Satch Studioを起動
Solution explorerで、黄色く表示されているものは、Exclude、赤い表示のものはInclude。
Hierarchy managerで、RefをDeleteしておく。
ti_torus1.sceneを3Dビューへドラッグ&ドロップして、名前をRef1にリネーム。
ti_torus2.sceneを3Dビューへドラッグ&ドロップして、名前をRef2にリネーム。
ti_torusのOrientationはx->90に設定(こうしないと水平に表示されてしまう)。
トラッキング・シナリオを作成します。
【顔検知】の場合
メニュ -> Tools -> Computer Visionを選択。
Mode -> Lite
User level -> Advanced
TragetのCreateボタンをクリック。
TargetのTypeをPlaneではなく、Face AutoInitにします。
Face TrackingのFace Classifierをhaarcascade_frontalface_alt2.xmlに設定。
File -> Save ASで、保存名をTracker1.xmlにして、facetrackerAutoinitフォルダーに保存。
【左目検知】の場合
顔検知の場合と同様。
保存名は、Tracker2.xmlにします。
(Targetを1つにしてもいいかもしれませんが、今回はお試しなので2つに分けてみます)
Luaファイルの編集
local MLTPlugin = getMLTPluginManager() local scene = getCurrentScene() local camera = Object3D(scene:getObjectByName("camera")) local inputManager = getInputManager() local keyboard = Keyboard(inputManager:getDevice(TIINPUT_KEYBOARDDEVICE)) local vidcap = VideoCapture(scene:getObjectByName("vidCap")) local message = Text2D(scene:getObjectByName("text1")) local isObjectRegistered = 0 local lEOSType = getOSType() local id = vidcap:getVidCapID() ---------left eye---------------------- local ref1 = Object3D(scene:getObjectByName("Ref1")) local position1 = Vector3() local positionInit1 = Vector3() local orientation1 = Quaternion() local orientationInit1 = Quaternion() local err_ret1 = eOk local trackingindex1 = -1 err_ret1, trackingindex1 = MLTPlugin:startTracking("facetrackerAutoinit/tracker1.xml", id, camera) -- Initial State positionInit1:setX(0) positionInit1:setY(0) positionInit1:setZ(0) ref1:setPosition(positionInit1, camera) ---------face---------------------- local ref2 = Object3D(scene:getObjectByName("Ref2")) local position2 = Vector3() local positionInit2 = Vector3() local orientation2 = Quaternion() local orientationInit2 = Quaternion() local err_ret2 = eOk local trackingindex2 = -1 err_ret2, trackingindex2 = MLTPlugin:startTracking("facetrackerAutoinit/tracker2.xml", id, camera) -- Initial State positionInit2:setX(0) positionInit2:setY(0) positionInit2:setZ(0) ref2:setPosition(positionInit2, camera) coroutine.yield() repeat --left eye err_ret1,status1 = MLTPlugin:getTrackingStatus(trackingindex1) local targetstatus1 = -1 err_ret1, targetstatus1 = MLTPlugin:getTargetStatus(trackingindex1, 0) if (err_ret1 == eOk) and (targetstatus1 > 0) then ref1:setVisible(true) err_ret1 = MLTPlugin:getTargetPos(trackingindex1, 0, position1, orientation1) ref1:setPosition(position1, camera) else ref1:setVisible(false) end --face err_ret2,status2 = MLTPlugin:getTrackingStatus(trackingindex2) local targetstatus2 = -1 err_ret2, targetstatus2 = MLTPlugin:getTargetStatus(trackingindex2, 0) if (err_ret2 == eOk) and (targetstatus2 > 0) then ref2:setVisible(true) err_ret2 = MLTPlugin:getTargetPos(trackingindex2, 0, position2, orientation2) ref2:setPosition(position2, camera) else ref2:setVisible(false) end until coroutine.yield()
こんな感じです。
目の検知精度はまずまずですが、顔に関してはいまいち。
ただちょっと気になるのは、OpenCVのカスケードを使うと、左目とうたっているのですが右目も平気で検知してしまう。
対応が必要ですね。
さらに、3つ目のシナリオ(口)を追加してみると、こんな感じ。
お口の検知精度はさらに落ちます、なんでかな?
コントラストがはっきりしていないから?
それとも、Face Trackingのパラメータ設定か、TargetのScale値か?
あれこれいじって調べてみます。
TOP
トップページ| サイトマップ|