問題描述
我如何識別 kinect 跟蹤的第一個骨架,然后對其進行處理.我只對第一個骨架感興趣,以后我不需要它們.最好根本不跟蹤進入的下一個骨架.
How can i ID the first skeleton the kinect tracked and then do stuff with it. Im only interested in the first skeleton and whichever comes after i do not need them. Preferably the next skeleton that comes in is not tracked at all.
誰能幫我這個謝謝.目前我使用的下面的代碼不起作用.我嘗試了一些快速的 linq 查詢,但我不太確定如何使用它.總是有錯誤.
Can someone help me with this thanks. Currently the code below im using does not work. I have tried some quick linq query but im not very sure how to use it. Always having errors with it.
誰能給我一些我可以使用的例子提前謝謝!
Can someone give me some examples i can work with thanks in advance!!
private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
Skeleton[] skeletons = new Skeleton[0];
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame != null)
{
skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
skeletonFrame.CopySkeletonDataTo(skeletons);
}
}
using (DrawingContext dc = this.drawingGroup.Open())
{
// Draw a transparent background to set the render size
dc.DrawRectangle(Brushes.Black, null, new Rect(160, 0.0, RenderWidth, RenderHeight));
if (skeletons.Length != 0)
{
foreach (Skeleton skel in skeletons)
{
RenderClippedEdges(skel, dc);
if (skel.TrackingState == SkeletonTrackingState.Tracked)
{
this.TrackingId = Skel;
sensor.SkeletonStream.AppChoosesSkeletons = true;
sensor.SkeletonStream.ChooseSkeletons(skel.TrackingId);
this.DrawBonesAndJoints(skel, dc);
if (skel == null)
{
Process.Start("wmplayer.exe", "C:\Users\User\Downloads\Test.wma");
}
}
else if (skel.TrackingState == SkeletonTrackingState.NotTracked)
{
sensor.SkeletonStream.AppChoosesSkeletons = false;
}
}
}
// prevent drawing outside of our render area
this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(160, 0.0, RenderWidth, RenderHeight));
}
}
推薦答案
這段代碼只能追蹤一個骨架:
You can track only one skeleton with this piece of code:
int trackingID;
skeletonTracked = new Skeleton();
bool first = true;
Skeleton skeleton;
Skeleton[] skeletons = new Skeleton[6];
...
public void AllFramesReady(object sender, AllFramesReadyEventArgs e)
{
using (SkeletonFrame sFrame = e.OpenSkeletonFrame())
{
sFrame.CopySkeletonDataTo(skeletons);
skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault();
if (skeleton == null)
return;
}
using (DrawingContext dc = this.drawingGroup.Open())
{
// Draw a transparent background to set the render size
dc.DrawRectangle(Brushes.Black, null, new Rect(160, 0.0, RenderWidth, RenderHeight));
RenderClippedEdges(skel, dc);
if (skeleton.TrackingState == SkeletonTrackingState.Tracked)
{
if (first)
{
skeletonTracked = skeleton;
trackingId = skeleton.TrackingID;
...
first = false;
}
if (skeleton.TrackingID == trackingId)
{
...
}
}
...
}
}
此代碼查找檢測到的第一個骨架,如果它的跟蹤 ID 等于檢測到的第一個骨架,則對它執行操作,否則您不對稍后檢測到的其他骨架執行操作.但是,我會看到 Kinect 用戶檢測,因為它具有其他單獨檢測骨架的方法ID/索引.ID 的方法非常適合區分多個玩家,但對于每個骷髏來說,它們的變化很大.索引會保存很短的時間,因此您可以編寫一些代碼來檢測骨架是否離開了框架.
This code finds the first skeleton detected, if it's tracking ID is equal to the first one detected, then you perform operations with it, otherwise you don't perform operations on other skeletons that are detected later. However, I would see Kinect user Detection as it has other methods of detecting skeletons with seperate ids/indexes. The method of IDs is great for distinguishing between multiple players, but they change largely for every skeleton. The indexes are saved for a short time so you could have some code for detecting that the skeleton left the frame.
這篇關于Kinect:我如何識別第一個跟蹤的骨架并在之后用它做些什么的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!