Использование V1 Kinect ® для Windows ® из Image Acquisition Toolbox™

В этом примере показано, как получить данные, доступные от Kinect для датчика V1 Windows с помощью Image Acquisition Toolbox:

Служебные функции

В порядок, чтобы сохранить этот пример максимально простым, были созданы некоторые служебные функции для работы с метаданными Kinect для Windows. Эти служебные функции включают функцию skeletalViewer, которая принимает данные скелета, цветное изображение и количество скелетов как входы и отображает скелет, наложенный на цветное изображение

Просмотр доступных Kinect для устройств и форматов Windows

Kinect для Windows имеет два датчика, датчик цвета и датчик глубины. Чтобы включить независимое приобретение с каждого из этих устройств, они рассматриваются как два независимых устройства в Image Acquisition Toolbox. Это означает, что отдельный объект VIDEOINPUT должен быть создан для каждого из устройств цвета и глубины (IR).

% The Kinect for Windows Sensor shows up as two separate devices in IMAQHWINFO.
hwInfo = imaqhwinfo('kinect')
hwInfo =

       AdaptorDllName: [1x68 char]
    AdaptorDllVersion: '4.5 (R2013a Prerelease)'
          AdaptorName: 'kinect'
            DeviceIDs: {[1]  [2]}
           DeviceInfo: [1x2 struct]

hwInfo.DeviceInfo(1)
ans =

             DefaultFormat: 'RGB_640x480'
       DeviceFileSupported: 0
                DeviceName: 'Kinect Color Sensor'
                  DeviceID: 1
     VideoInputConstructor: 'videoinput('kinect', 1)'
    VideoDeviceConstructor: 'imaq.VideoDevice('kinect', 1)'
          SupportedFormats: {1x7 cell}

hwInfo.DeviceInfo(2)
ans =

             DefaultFormat: 'Depth_640x480'
       DeviceFileSupported: 0
                DeviceName: 'Kinect Depth Sensor'
                  DeviceID: 2
     VideoInputConstructor: 'videoinput('kinect', 2)'
    VideoDeviceConstructor: 'imaq.VideoDevice('kinect', 2)'
          SupportedFormats: {'Depth_320x240'  'Depth_640x480'  'Depth_80x60'}

Получение данных о цвете и глубине

В порядок получения синхронизированных данных о цвете и глубине мы должны использовать ручное срабатывание вместо немедленного срабатывания. Немедленное срабатывание по умолчанию страдает от задержки между потоками при выполнении синхронизированного захвата. Это происходит из-за накладных расходов в запуске потоков последовательно.

% Create the VIDEOINPUT objects for the two streams
colorVid = videoinput('kinect',1)
Summary of Video Input Object Using 'Kinect Color Sensor'.

   Acquisition Source(s):  Color Source is available.

  Acquisition Parameters:  'Color Source' is the current selected source.
                           10 frames per trigger using the selected source.
                           'RGB_640x480' video data to be logged upon START.
                           Grabbing first of every 1 frame(s).
                           Log data to 'memory' on trigger.

      Trigger Parameters:  1 'immediate' trigger(s) on START.

                  Status:  Waiting for START.
                           0 frames acquired since starting.
                           0 frames available for GETDATA.

depthVid = videoinput('kinect',2)
Summary of Video Input Object Using 'Kinect Depth Sensor'.

   Acquisition Source(s):  Depth Source is available.

  Acquisition Parameters:  'Depth Source' is the current selected source.
                           10 frames per trigger using the selected source.
                           'Depth_640x480' video data to be logged upon START.
                           Grabbing first of every 1 frame(s).
                           Log data to 'memory' on trigger.

      Trigger Parameters:  1 'immediate' trigger(s) on START.

                  Status:  Waiting for START.
                           0 frames acquired since starting.
                           0 frames available for GETDATA.

% Set the triggering mode to 'manual'
triggerconfig([colorVid depthVid],'manual');

Установите свойство FramesPerTrigger объектов VIDEOINPUT на '100', чтобы получить 100 системы координат на триггер. В этом примере 100 систем координат получены, чтобы предоставить датчику Kinect для Windows достаточно времени, чтобы начать отслеживать скелет.

colorVid.FramesPerTrigger = 100;
depthVid.FramesPerTrigger = 100;
% Start the color and depth device. This begins acquisition, but does not
% start logging of acquired data.
start([colorVid depthVid]);
% Trigger the devices to start logging of data.
trigger([colorVid depthVid]);
% Retrieve the acquired data
[colorFrameData,colorTimeData,colorMetaData] = getdata(colorVid);
[depthFrameData,depthTimeData,depthMetaData] = getdata(depthVid);
% Stop the devices
stop([colorVid depthVid]);

Сконфигурируйте отслеживание скелета

Датчик Kinect для Windows обеспечивает различные режимы отслеживания скелетов. Эти режимы могут быть доступны и сконфигурированы из объекта VIDEOSOURCE устройства глубины. Посмотрим, как включить отслеживание скелета.

% Get the VIDEOSOURCE object from the depth device's VIDEOINPUT object.
depthSrc = getselectedsource(depthVid)
   Display Summary for Video Source Object:

      General Settings:
        Parent = [1x1 videoinput]
        Selected = on
        SourceName = Depth Source
        Tag =
        Type = videosource

      Device Specific Properties:
        Accelerometer = [-0.008547 -0.98046 -0.11966]
        BodyPosture = Standing
        CameraElevationAngle = 9
        DepthMode = Default
        FrameRate = 30
        IREmitter = on
        SkeletonsToTrack = [1x0 double]
        TrackingMode = Off

Свойства объекта-источника глубины, которые управляют функциями отслеживания скелета, являются свойствами TrackingMode, SkeletonToTrack и BodyPosture в VIDEOSOURCE.

TrackingMode контролирует, включено или нет отслеживание скелета, и, если включено, отслеживаются ли все соединения, «Скелет», или, если отслеживается только положение бедра, «Положение». Установка значения «off» (по умолчанию) в TrackingMode отключает все отслеживание и уменьшает загрузку центрального процессора.

Свойство «BodyPosture» определяет, сколько соединений отслеживается. Если значение «BodyPosture» установлено на «Standing», отслеживаются двадцать соединений. Если установлено значение «Seated», то отслеживаются десять соединений.

Свойство SkeletonToTrack может использоваться для выборочного отслеживания одного или двух скелетов с помощью SkeletonTrackingID. Текущие значения для 'SkeletonTrackingID' возвращаются как часть метаданных устройства глубины.

% Turn on skeletal tracking.
depthSrc.TrackingMode = 'Skeleton';

Доступ к скелетным данным

Данные скелета, которые создает Kinect для Windows, доступны с устройства глубины как часть метаданных, возвращаемых GETDATA. Kinect для Windows может отслеживать положение до шести человек в поле зрения и может активно отслеживать местоположение соединений двух из шести скелетов. Он также поддерживает два режима отслеживания людей на основе того, стоят они или сидят. В постоянном режиме отслеживаются и возвращаются полные 20 мест соединения; в сидячем режиме возвращаются 10 верхних соединений корпуса. Для получения дополнительной информации о данных скелета см. документацию MATLAB по адаптеру Kinect для Windows.

% Acquire 100 frames with tracking turned on.
% Remember to have a person in person in front of the
% Kinect for Windows to see valid tracking data.
colorVid.FramesPerTrigger = 100;
depthVid.FramesPerTrigger = 100;
start([colorVid depthVid]);
trigger([colorVid depthVid]);
% Retrieve the frames and check if any Skeletons are tracked
[frameDataColor] = getdata(colorVid);
[frameDataDepth, timeDataDepth, metaDataDepth] = getdata(depthVid);
% View skeletal data from depth metadata
metaDataDepth
metaDataDepth =

100x1 struct array with fields:

    AbsTime
    FrameNumber
    IsPositionTracked
    IsSkeletonTracked
    JointDepthIndices
    JointImageIndices
    JointTrackingState
    JointWorldCoordinates
    PositionDepthIndices
    PositionImageIndices
    PositionWorldCoordinates
    RelativeFrame
    SegmentationData
    SkeletonTrackingID
    TriggerIndex

Мы случайным образом выбираем 95-ую систему координат, чтобы визуализировать изображение и данные скелета.

% Check for tracked skeletons from depth metadata
anyPositionsTracked = any(metaDataDepth(95).IsPositionTracked ~= 0)
anySkeletonsTracked = any(metaDataDepth(95).IsSkeletonTracked ~= 0)
anyPositionsTracked =

     1


anySkeletonsTracked =

     1

Результаты выше показывают, что по крайней мере один скелет отслеживается. Если отслеживание включено, но идентификаторы не заданы со свойством TrackingID, программное обеспечение Kinect for Windows автоматически выбирает до двух скелетов для отслеживания. Используйте метаданные IsSkeletonTracked, чтобы определить, какие скелеты отслеживаются.

% See which skeletons were tracked.
trackedSkeletons = find(metaDataDepth(95).IsSkeletonTracked)
trackedSkeletons =

     1

Отображение координат соединений каркаса. Обратите внимание, что если для свойства 'BodyPosture' задано значение 'Seated', значение 'JointCoordinates' и 'JointIndices' все еще будет иметь длину 20, но только индексы 2-11 (соединения верхнего тела) будут заполнены.

jointCoordinates = metaDataDepth(95).JointWorldCoordinates(:, :, trackedSkeletons)
% Skeleton's joint indices with respect to the color image
jointIndices = metaDataDepth(95).JointImageIndices(:, :, trackedSkeletons)
jointCoordinates =

   -0.0119   -0.0072    1.9716
   -0.0107    0.0545    2.0376
   -0.0051    0.4413    2.0680
    0.0033    0.6430    2.0740
   -0.1886    0.3048    2.0469
   -0.3130    0.0472    2.0188
   -0.3816   -0.1768    1.9277
   -0.3855   -0.2448    1.8972
    0.1724    0.3022    2.0449
    0.3102    0.0382    2.0304
    0.3740   -0.1929    1.9591
    0.3786   -0.2625    1.9356
   -0.0942   -0.0850    1.9540
   -0.1367   -0.4957    1.9361
   -0.1356   -0.8765    1.9339
   -0.1359   -0.9284    1.8341
    0.0683   -0.0871    1.9504
    0.0706   -0.4822    1.9293
    0.0858   -0.8804    1.9264
    0.0885   -0.9321    1.8266


jointIndices =

   318   256
   317   240
   318   143
   319    92
   271   177
   239   243
   219   303
   216   323
   363   177
   399   243
   421   303
   424   322
   296   277
   286   387
   288   492
   286   520
   340   277
   342   384
   347   493
   350   522

Нарисуйте каркас поверх соответствующего цветного изображения

% Pull out the 95th color frame
image = frameDataColor(:, :, :, 95);

% Find number of Skeletons tracked
nSkeleton = length(trackedSkeletons);

% Plot the skeleton
util_skeletonViewer(jointIndices, image, nSkeleton);