2012-01-11 5 views
3

Так что я пытаюсь сделать, это взять образец скелета Kinect и сохранить x количество фотографий, только когда идет человек. Я получил его на работу, за исключением случаев, когда он обнаруживает человека, он просто регистрирует количество фотографий даже после того, как человек покидает видение Kinect. Кто-нибудь знает, как сделать так, чтобы как только человек вошел в него, он начинает записывать, и как только они покидают его?Kinect - Обнаружение, когда человек выходит из кадра

Переменные

Runtime nui; 
    int totalFrames = 0; 
    int totalFrames2 = 0; 
    int lastFrames = 0; 
    int lastFrameWithMotion = 0; 
    int stopFrameNumber = 100; 
    DateTime lastTime = DateTime.MaxValue; 

Ввод/Выход из кадра

void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    { 
     SkeletonFrame skeletonFrame = e.SkeletonFrame; 

     int iSkeleton = 0; 
     ++totalFrames; 
     string bb1 = Convert.ToString(totalFrames); 
     //Uri uri1 = new Uri("C:\\Research\\Kinect\\Proposal_Skeleton\\Skeleton_Img" + bb1 + ".png"); 
     Uri uri1 = new Uri("C:\\temp\\Skeleton_Img" + bb1 + ".png"); 
     // string file_name_3 = "C:\\Research\\Kinect\\Proposal_Skeleton\\Skeleton_Img" + bb1 + ".png"; // xxx 
     Brush[] brushes = new Brush[6]; 
     brushes[0] = new SolidColorBrush(Color.FromRgb(255, 0, 0)); 
     brushes[1] = new SolidColorBrush(Color.FromRgb(0, 255, 0)); 
     brushes[2] = new SolidColorBrush(Color.FromRgb(64, 255, 255)); 
     brushes[3] = new SolidColorBrush(Color.FromRgb(255, 255, 64)); 
     brushes[4] = new SolidColorBrush(Color.FromRgb(255, 64, 255)); 
     brushes[5] = new SolidColorBrush(Color.FromRgb(128, 128, 255)); 

     skeleton.Children.Clear(); 
     //byte[] skeletonFrame32 = new byte[(int)(skeleton.Width) * (int)(skeleton.Height) * 4]; 
     foreach (SkeletonData data in skeletonFrame.Skeletons) 
     { 
      if (SkeletonTrackingState.Tracked == data.TrackingState) 
      { 
       // Draw bones 
       Brush brush = brushes[iSkeleton % brushes.Length]; 
       skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.HipCenter, JointID.Spine, JointID.ShoulderCenter, JointID.Head)); 
       skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.ShoulderCenter, JointID.ShoulderLeft, JointID.ElbowLeft, JointID.WristLeft, JointID.HandLeft)); 
       skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.ShoulderCenter, JointID.ShoulderRight, JointID.ElbowRight, JointID.WristRight, JointID.HandRight)); 
       skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.HipCenter, JointID.HipLeft, JointID.KneeLeft, JointID.AnkleLeft, JointID.FootLeft)); 
       skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.HipCenter, JointID.HipRight, JointID.KneeRight, JointID.AnkleRight, JointID.FootRight)); 

       // Draw joints 
       // try to add a comment, xxx 
       foreach (Joint joint in data.Joints) 
       { 
        Point jointPos = getDisplayPosition(joint); 
        Line jointLine = new Line(); 
        jointLine.X1 = jointPos.X - 3; 
        jointLine.X2 = jointLine.X1 + 6; 
        jointLine.Y1 = jointLine.Y2 = jointPos.Y; 
        jointLine.Stroke = jointColors[joint.ID]; 
        jointLine.StrokeThickness = 6; 
        skeleton.Children.Add(jointLine); 
       } 
       //  ExportToPng(uri1, skeleton); 
       // SoundPlayerAction Source = "C:/LiamScienceFair/muhaha.wav"; 
       //SoundPlayer player1 = new SoundPlayer("muhaha.wav") 
       // player1.Play(); 
       // MediaPlayer. 
       // axWindowsMediaPlayer1.currentPlaylist = axWindowsMediaPlayer1.mediaCollection.getByName("mediafile"); 


       nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_ColorFrameReady2); 



      } 


      iSkeleton++; 
     } // for each skeleton 
    } 

Фактический код

void nui_ColorFrameReady2(object sender, ImageFrameReadyEventArgs e) 
    { 
     // 32-bit per pixel, RGBA image xxx 
     PlanarImage Image = e.ImageFrame.Image; 
     int deltaFrames = totalFrames - lastFrameWithMotion; 
     if (totalFrames2 <= stopFrameNumber & deltaFrames > 300) 
     { 
      ++totalFrames2; 
      string bb1 = Convert.ToString(totalFrames2); 
      // string file_name_3 = "C:\\Research\\Kinect\\Proposal\\Depth_Img" + bb1 + ".jpg"; xxx 
      string file_name_4 = "C:\\temp\\Video2_Img" + bb1 + ".jpg"; 
      video.Source = BitmapSource.Create(
       Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel); 

      BitmapSource image4 = BitmapSource.Create(
       Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel); 
      image4.Save(file_name_4, Coding4Fun.Kinect.Wpf.ImageFormat.Jpeg); 
      if (totalFrames2 == stopFrameNumber) 
      { 
       lastFrameWithMotion = totalFrames; 
       stopFrameNumber += 100; 
      } 
     } 

    } 
+1

Я не вижу какой-либо код, чтобы определить, когда человек входит/выходит из кадра. Из того, что вы сказали, фактическая сохранность изображения (то, что вы опубликовали) работает нормально. – Jason

+0

Да, но как только кто-то входит в представление kinect, он начинает сохранять кадры, пока не нажмет stopFrameNumber, даже если человек покидает представление. –

+0

Как вы обнаруживаете, когда кто-то покидает представление? Или это то, что вы хотите знать, как это сделать? – Jason

ответ

2

I woul Попробуй что-нибудь подобное. Создайте переменную класса bool с именем SkeletonInFrame и инициализируйте ее значением false. Каждый раз, когда срабатывает SkeletonFrameReady, установите для этого bool значение true. Когда вы обрабатываете цветовой кадр, обрабатывайте только, если эта переменная истинна. Затем после обработки цветового фрейма установите для переменной значение false. Это должно помочь вам прекратить обработку кадра, когда вы больше не получаете скелетные события.

+0

Хорошо, пробовал это –

+0

Я пробовал это, а затем он сказал, что SkeletonFrameReady не является допустимым методом, любая помощь там? –

+0

Я давал вам псевдокод. В вашем коде вы называете это nui_SkeletonFrameReady() – Jason

3

В большинстве установок, которые я использовал в области событий отслеживания скелета, есть проверка на наличие (скелет! = Нуль) всего, что вам нужно сделать, это сбросить ваш триггер после получения нулевого скелета.

В SDK будет посылать скелет фрейм каждый раз, когда событие происходит так ...

if(skeleton != null) 
{ 
    \\do image taking here 
} 
else 
{ 
    \\reset image counter 
} 
Смежные вопросы