exponenta event banner

Использование V1 Kinect ® для Windows ® из Toolbox™ получения изображений

В этом примере показано, как получить данные с сенсора Kinect for Windows V1 с помощью панели инструментов получения изображений:

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

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

См. раздел Что такое Kinect для устройств и форматов Windows

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

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

Свойство «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 для Windows автоматически выбирает для отслеживания до двух каркасов. Метаданные IsSkeletonTracked используются для определения отслеживаемых каркасов.

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

     1

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