Опитвам се да разработя нещо, което изглежда като проста програма, която използва Kinect за Xbox360, за да изчисли разстоянието, изминато от човек. Стаята, към която ще бъде насочен Kinect, ще бъде 10 x 10. След като потребителят натисне бутона, обектът ще се движи в това пространство. След като обектът достигне крайната си дестинация в района, потребителят ще натисне бутона отново. След това Kinect ще изведе колко разстояние е изминал обектът между двете натискания на бутоните. Тъй като никога преди не е разработван за Kinect, беше доста обезсърчително да започнете. Проблемът ми е, че не съм напълно сигурен какво трябва да използвам за измерване на разстоянието. В моите изследвания открих начини да изчисля разстоянието, на което е даден обект ОТ Kinect, но това е всичко.
Използване на Kinect за изчисляване на изминатото разстояние
Отговори (1)
Това, което чухте, е прост въпрос за работа с декартова равнина. Kinect има 20 стави, които съществуват в пространството XYZ, а разстоянието се измерва в метри. За да получите достъп до тези съединения, имате тези изрази в клас "Tracker" (това е C#... не съм сигурен дали използвате C# или C++ в SDK):
public Tracker(KinectSensor sn, MainWindow win, string fileName)
{
window = win;
sensor = sn;
try
{
sensor.Start();
}
catch (IOException)
{
sensor = null;
MessageBox.Show("No Kinect sensor found. Please connect one and restart the application", "*****ERROR*****");
return;
}
sensor.SkeletonFrameReady += SensorSkeletonFrameReady; //Frame handlers
sensor.ColorFrameReady += SensorColorFrameReady;
sensor.SkeletonStream.Enable();
sensor.ColorStream.Enable();
}
Те имат достъп до цветните и скелетните потоци от Kinect. Скелетният поток съдържа ставите, така че вие се фокусирате върху това с тези твърдения:
//Start sending skeleton stream
private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
//Access the skeleton frame
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame != null)
{
//Check to see if there is any data in the skeleton
if (this.skeletons == null)
//Allocate array of skeletons
this.skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
//Copy skeletons from this frame
skeletonFrame.CopySkeletonDataTo(this.skeletons);
//Find first tracked skeleton, if any
Skeleton skeleton = this.skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();
if (skeleton != null)
{
//Initialize joints
///<summary>
///Joints to be displayed, projected, recorded, etc.
///</summary>
Joint leftFoot = skeleton.Joints[JointType.FootLeft];
}
}
И така, в началото на вашата програма искате да изберете става (има 20... изберете такава, която ВИНАГИ ще е обърната към Kinect, когато изпълнявате програмата) и да получите нейното местоположение с нещо като следните изявления:
if(skeleton.Joints[JointType.FootLeft].TrackingState == JointTrackingState.Tracked)
{
double xPosition = skeleton.Joints[JointType.FootLeft].Position.X;
double yPosition = skeleton.Joints[JointType.FootLeft].Position.Y;
double zPosition = skeleton.Joints[JointType.FootLeft].Position.Z;
}
В крайна сметка ще искате да имате малко забавяне, преди да спрете потока... известно време между щракването и когато изключите потока от Kinect. След това ще направите математиката, която трябва да направите, за да получите разстоянието между двете точки. Ако нямате забавяне, няма да можете да получите вашата декартова точка.