Я пытаюсь разработать простую программу, которая использует 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. Затем вы выполните математические действия, необходимые для получения расстояния между двумя точками. Если у вас нет задержки, вы не сможете получить свою декартову точку.