Используя Kinect® для Windows® V1 от Image Acquisition Toolbox™

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

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

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

Смотрите то, Что Kinect для Windows Devices и Форматов Доступен

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 обеспечивает различные режимы, чтобы отследить skeletons. К этим режимам можно получить доступ и сконфигурировать от объекта 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 управляет, включено ли скелетное отслеживание и, если это включено, прослежены ли все соединения, 'Скелет', или если только модное положение прослежено, 'Положение'. Установка TrackingMode к 'off' (значение по умолчанию) отключает все отслеживание и уменьшает загрузку ЦП.

Свойство ‘BodyPosture’ определяет, сколько соединений прослежено. Если ‘BodyPosture’ установлен в 'Положение', двадцать соединений прослежены. Если это установлено в 'Усаженный', то десять соединений прослежены.

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

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

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

Скелетные данные, что Kinect для продуктов Windows доступен от устройства глубины как часть метаданных, возвращенных GETDATA. Kinect для Windows может отследить положение до шести человек в поле зрения и может активно отследить объединенные местоположения двух из шести skeletons. Это также поддерживает два режима отслеживания людей на основе того, стоят ли они или усаженные. В постоянном режиме все 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 для программного обеспечения Windows автоматически разделился на команды к двум skeletons, чтобы отследить. Используйте метаданные IsSkeletonTracked, чтобы определить, какие skeletons прослеживаются.

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

     1

Отобразите объединенные координаты скелета. Обратите внимание на то, что, если свойство 'BodyPosture' будет установлено в 'Усаженный', '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);