2013-09-26 2 views
0

Мне сложно понять, что на самом деле происходит, когда kinect используется с медленными компьютерами или требуются тяжелые вычисления в рамке.Механика Kinect: куда уходят рамы? - случай с частотой кадров

Давайте рассмотрим C# sample code для восстановления глубины.

Динамика времени исполнения определяется событием DepthFrameReady. Сообщаемая здесь функция DepthImageReady вызывается при срабатывании такого события.

private void DepthImageReady(object sender, DepthImageFrameReadyEventArgs e) 
{ 
    using (DepthImageFrame depthFrame = e.OpenDepthImageFrame()) 
    { 
     if (depthFrame != null) 
     { 
      depthFrame.CopyDepthImagePixelDataTo(this.depthPixels); 

      //MY OPERATIONS BLABLABLA... 
     } 
     else 
     { 
     // depthFrame is null because the request did not arrive in time 
     } 
    } 
} 

Мой кросс-коррелируют вопросы:

  • Является ли эта функция на самом деле вызывается для каждого кадра?
  • Почему такое depthFrame может быть Null?
  • Что действительно происходит, если мои операции занимают больше времени, чем номинальное межкадровое время (33 мс)?
  • Есть ли какой-либо буфер внутри kinect?

Любая помощь оценивается.

+1

«Где пропадают рамки?» Конечно, Тумболии. – Ben

ответ

1

Согласно учебник здесь:

Согласно этой обучающей программе, событие вызывается для каждого кадра (то есть в очереди в очереди событий), однако, если вы слишком долго обрабатывая предыдущий кадр, вы обнаружите, что при обработке следующего кадра метод OpenDepthImageFrame() вернет null, указывая, что данные кадра больше не доступны.

+0

, который объясняет эту строку: если (глубинаFrame! = Null) – user3800527

0

Я думаю, что механик состоит в том, что это всего лишь буфер Событие (начало поиска изображения) поднимается, когда у него есть данные. Поскольку данные не сохраняются (это не очередь), он стирается и записывается снова для каждого запускаемого потока. Таким образом, существует проверка с помощью! = Null

Они могут в фоновом режиме поднимать потоки с указателем, указывающим на новую область буфера, а затем путем изменения указателя буфера (новый кадр загружает arives завершен) они заменяют только указатели, эффективно приводящие к нулевому указателю для старого потока и старых данных, в то время как новый поток имеет новые данные (данные остаются до тех пор, пока этот поток жив). но потоки, которые были поставлены в очередь, не содержат данных (указатель был заменен), и поэтому для вашего приложения тогда очередь протектора не будет наращиваться. и старые данные изображения нитей не будут стоять в очереди.

Ну, вот как я думаю, что это работает, но у меня нет исходного кода, никто не имеет.

Смежные вопросы