2013-04-10 16 views
0

我想估算Kinect傳感器拍攝的場景中玩家的深度位置,以便在需要評估手和玩家距離的算法中使用此信息「玩家的身體」。在這種情況下,「玩家的身體」這個概念可以轉化爲一個代表玩家深度位置的值(這就是我正在尋找的)。估算玩家深度的大概位置

很明顯,因爲一個人佔據了空間的體積,我們知道無法在場景中定義玩家的精確位置。

我想知道的是:使用骨架數據來計算人的縱深位置的最佳做法是什麼?

我試圖用下面的代碼:

Skeleton playerSkeleton = (from s in skeletonData where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); 

... 

if (playerSkeleton != null) 
{ 
    Joint head = playerSkeleton.Joints[JointType.Head]; 

    float averagePlayerPosition = head.Z; 
} 

在上述方式中,我使用的頭部的深度來定義播放器的位置。

這是一個不錯的選擇,還是有更好的東西(例如幾個points of the skeleton的平均數)?如果我的選擇是可以改進的,是否有一些參考文獻能證明更好的選擇?

回答

1

Head,SpineHipCenter都是足夠的點足以拔出。

我會建議SpineHipCenter過頭,因爲除非用戶移動他們的整個身體,否則這兩點不能移動很多。也就是說 - 你可以前傾,後退以改變位置,但除非用戶身體移動整個身體,否則其他兩個位置不會發生顯着變化。

根據您的應用程序的目的,Head也可能從用戶的角度來看是有意義的。從你的描述來看,我認爲這樣做的可能性較小,但也許傾向於進出更新自己的整體位置確實符合用戶的心理模型。

有一個Position財產上Skeleton本身以及: http://msdn.microsoft.com/en-us/library/microsoft.kinect.skeleton.position.aspx

我真的不知道這是怎麼計算的,因爲我從來沒有使用過它,但你可以要求Skeleton.Position.Z得到不斷根據Kinect計算用戶的距離。

+0

其他一些人已經談到了「Skeleton.Position」的含義,並且有人說它可能是「來自已識別用戶的大衆中心」......看到這個[link](http:// social。msdn.microsoft.com/Forums/en-US/kinectsdknuiapi/thread/ee12b17d-3606-4416-8924-12fa8e482421/) – 2013-04-10 15:09:41

+0

這似乎適合;特別是因爲它可用於非活動骨架。我查看了一些以前的代碼,實際上當決定跟蹤哪個用戶時,我實際上會使用這個(我撒謊,對不起),當我想要「最親密」的人時。工作得很好。 – 2013-04-10 15:13:53