2012-10-26 44 views
1

我正在開發一個遊戲,使用Kinect與Windows Kinect SDK 1.5。 Kinect相機放在桌子上,我站在Kinect的側面。 我想顯示的播放器的骨架,像圖1和2 enter image description here 圖1 enter image description here 圖2Kinect側身骨架顯示器

這些需要通過超高動力學骨架流檢測的關節位置。但在大多數情況下,當玩家側身站立時,Kinect無法檢測到隱藏在後面的一些關節。如圖1所示,當我將手臂重疊時,我不希望隱藏手臂的關節顯示在屏幕上。我只想顯示我左臂的關節。另一種情況是,當我以正常方式放置手臂時,如圖2所示,我想要顯示它們兩個。

我的想法是使用關節的位置信息和跟蹤狀態來決定一隻手臂是否在身體的另一部分的後面(有許多類型的重疊,手臂,手臂身體,手臂頭部, - 手臂到腿)。但我不認爲這是不夠的,只是不顯示Kinect沒有跟蹤的關節。也許我們可以通過計算兩個手腕,兩個​​肘部和兩個肩膀之間的距離來檢測兩個手臂是否重疊。如果兩個手腕和兩個手肘之間的距離都在閾值範圍內,那麼兩個手臂之間會有重疊,我們只能顯示跟蹤手臂骨架的關節。

但還有另一個問題,有一個手臂有很多方法與身體的另一部分重疊,腿也是如此。所以這個解決方案在顯示之前需要很多門檻和檢查。此外,我不確定這個解決方案的效果。

你們有沒有更酷的想法來解決這個問題?

+0

確切複製http://stackoverflow.com/questions/10192476/kinect-sideways-skeleton-tracking – Kinected

回答

0

查看v1.5 SDK Toolkit示例附帶的SkeletonBasics-WPF示例。它會告訴你類似的行爲,你想要做什麼。

的代碼,將可能是最感興趣的塊是這一個:

foreach (Joint joint in skeleton.Joints) 
{ 
    Brush drawBrush = null; 

    if (joint.TrackingState == JointTrackingState.Tracked) 
    { 
     drawBrush = this.trackedJointBrush; 
    } 
    else if (joint.TrackingState == JointTrackingState.Inferred) 
    { 
     drawBrush = this.inferredJointBrush; 
    } 

    if (drawBrush != null) 
    { 
     drawingContext.DrawEllipse(drawBrush, null, this.SkeletonPointToScreen(joint.Position), JointThickness, JointThickness); 
    } 
} 

注意JointTrackingState.Inferred檢查。在這個演示中,關節繼續顯示,但它們變成黃色。在你的情況下,你可以隱藏它們。 JointTracingState也有NotTracked枚舉,這也可能是有用的,具體取決於你的情況。

在示例的情況下,骨骼也僅在Tracked的關節之間繪製。

順便說一句 - 在撰寫本文時,官方的Kinect for Windows SDK是v1.6。您可能想要查看更新。

+0

感謝您的評論。我有爲追蹤,引用和未追蹤的關節繪製不同顏色的功能。在我的身影中看到的灰色點被稱爲關節(藍色的點是被跟蹤的關節)。 – Badger

+0

你的問題是隱藏隱藏的關節和骨骼。推斷關節是Kinect無法看到的那些(即它們被阻擋)但正在猜測的關節,而NotTracked關節則顯得不可見。看推斷(和他們的z-索引相比,已知的關節)會告訴你他們在哪裏以及如何被阻止。或者我錯過了你的問題? –

+0

感謝您的評論。所以推斷的關節也有x,y,z位置信息,但它們是Kinect無法看到的。你知道有其他可能導致推斷聯合的情況,除非它們被阻止嗎?
我發現即使關節和Kinect之間沒有障礙物,有時也會推斷關節。 – Badger

0

這是Kinect sideways skeleton tracking的完全重複,所以請看Outlaw Lemur's answer,它解釋了Kinect的功能,以及爲什麼這樣做不起作用,有些嘗試解決如何使其工作。從本質上講,他是說Kinect是爲了追蹤人們的臉部或背部,但會將其解釋爲他們的正面。側向追蹤不起作用,因爲Kinect只能看到一半的關節,並且必須對其餘部分進行估計,導致不良結果。