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





トップページ| サイトマップ|