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
トップページ| サイトマップ|