Получение изображений и данных о скелете с помощью Kinect

При обнаружении устройств Kinect можно было увидеть, что два датчика на Kinect® для Windows® представлены двумя идентификаторами устройства, один для датчика цвета и один из датчика глубины. В этом примере Устройство 1 является датчиком цвета, а Устройство 2 является датчиком глубины. В этом примере показано, как создать videoinput объект для датчика цвета, чтобы получить изображения RGB, а затем для датчика глубины, чтобы получить данные скелета.

  1. Создайте videoinput объект для датчика цвета. DeviceID 1 используется для датчика цвета.

    vid = videoinput('kinect',1,'RGB_640x480');
  2. Посмотрите на свойства конкретного устройства на исходном устройстве, которое является датчиком цвета на камере Kinect.

    src = getselectedsource(vid);
    
    src
    
    Display Summary for Video Source Object:
     
          General Settings:
            Parent = [1x1 videoinput]
            Selected = on
            SourceName = ColorSource
            Tag = 
            Type = videosource
     
          Device Specific Properties:
            Accelerometer = [0.0 -1.0 0.0]
            AutoExposure = on
            AutoWhiteBalance = on
            BacklightCompensation = AverageBrightness
            Brightness = 0.2156
            CameraElevationAngle = 3
            Contrast = 1
            ExposureTime = 1.0
            FrameInterval = 0
            FrameRate = 30
            Gain = 0
            Gamma = 2.2
            Hue = 0
            PowerLineFrequency = Disabled
            Saturation = 1
            Sharpness = 0.5
            WhiteBalance = 2700

    Как видно на выходе, датчик цвета имеет набор специфических для устройства свойств.

    Свойство конкретного устройства - Датчик цветаОписание
    AccelerometerВозвращает 3D вектор данных ускорения для датчиков цвета и глубины. Данные обновляются во время работы или предварительного просмотра устройства.

    Этот дабл 1 x 3 представляет x, y, и z значения ускорения в единицах тяжести g (9.81m/s^2). Для примера,

    [0.06 -1.00 -0.09]

    представляет значения x как 0.06 g, y как -1.00 g, и z как -0.09 g.

    AutoExposureИспользуется для автоматической настройки воздействия. Это определяет, активированы ли другие связанные свойства. Значения on (по умолчанию) и off.

    on означает, что экспозиция устанавливается автоматически, и эти свойства не могут быть установлены и выдадут предупреждение: FrameInterval, ExposureTime, и Gain.

    off означает, что эти свойства не могут быть установлены и выдадут предупреждение: PowerLineFrequency, BacklightCompensation, и Brightness.

    AutoWhiteBalanceИспользуйте, чтобы включить или отключить автоматическую настройку баланса белого.

    on (по умолчанию) означает, что он автоматически сконфигурирует баланс белого и WhiteBalance свойство не может быть задано.

    off означает, что WhiteBalance свойство можно установить.

    BacklightCompensationНастраивает режимы компенсации подсветки, чтобы настроить камеру для захвата изображений, зависящих от условий окружающей среды.

    Обратите внимание, что это свойство допустимо только в том случае, если AutoExposure установлено в Enabled. Значение по умолчанию является AverageBrightness.

    Значения:

    AverageBrightness отдает предпочтение среднему уровню яркости

    CenterPriority отдает предпочтение центру сцены

    LowLightsPriority способствует низкому уровню освещенности

    CenterOnly отдает предпочтение только центру

    BrightnessУказывает на уровень яркости. Значение области значений 0.0 на 1.0, и значение по умолчанию является 0.2156.

    Обратите внимание, что это свойство допустимо только в том случае, если AutoExposure установлено в Enabled.

    CameraElevationAngleУправляет углом объектива датчика. Это угол камеры относительно земли. Значение должно быть целочисленным свойством с областью значений от -27 до 27 степеней. Значение по умолчанию является последним установленным значением, поскольку это липкая настройка. Установите его, только если хотите изменить угол наклона камеры. Это свойство разделяется с датчиком глубины также.
    ContrastУказывает на уровень контрастности. Значения должны быть в области значений 0.5 на 2, со значением по умолчанию 1.
    ExposureTimeУказывает время экспозиции в шагах 1/10 000 секунды. Значение области значений 0 на 4000, и по умолчанию это 0.

    Обратите внимание, что это свойство допустимо только в том случае, если AutoExposure установлено в Disabled.

    FrameIntervalУказывает интервал системы координат в модули 1/10 000 секунды. Значение области значений 0 на 4000, и по умолчанию это 0.

    Обратите внимание, что это свойство допустимо только в том случае, если AutoExposure установлено в Disabled.

    FrameRateСистем координат в секунду для сбора. Это свойство доступно только для чтения, и возможные значения для датчика цвета 12, 15, и 30 (по умолчанию). Он отражает фактическую частоту систем координат при запуске.
    GainУказывает множитель для значений цвета RGB. Значение области значений 1.0 на 16.0, и по умолчанию это 1.0.

    Обратите внимание, что это свойство допустимо только в том случае, если AutoExposure установлено в Disabled.

    GammaУказывает на гамма- измерение. Значения должны быть в области значений 1 на 2.8, со значением по умолчанию 2.2.
    HueУказывает на настройку оттенка. Значения должны быть в области значений -22 на 22, со значением по умолчанию 0.
    PowerLineFrequencyОпция для уменьшения мерцания, вызванного частотой линии степени. Значения Disabled, FiftyHertz, и SixtyHertz. Значение по умолчанию является Disabled.

    Обратите внимание, что это свойство допустимо только в том случае, если AutoExposure установлено в Enabled.

    SaturationУказывает на уровень насыщения. Значения должны быть в области значений 0 на 2, со значением по умолчанию 1.
    SharpnessУказывает на уровень резкости. Значения должны быть в области значений 0 на 1, со значением по умолчанию 0.5.
    WhiteBalanceЦветовая температура в степенях Кельвина. Значение области значений 2700 на 6500 и по умолчанию это 2700.

    Обратите внимание, что это свойство допустимо только в том случае, если AutoWhiteBalance установлено в Disabled.

  3. Можно опционально задать некоторые из этих свойств, показанных на предыдущем шаге. Для примера вы можете получать изображения в условиях низкой освещенности. Вы можете настроить приобретение для этого путем установки BacklightCompensation свойство к LowLightsPriority, что способствует низкому уровню света.

    src.BacklightCompensation = 'LowLightsPriority';
  4. Предварительный просмотр цветового потока по вызову preview на объекте датчика цвета, созданном на шаге 1.

    preview(vid);

    После завершения предварительного просмотра закройте окно предварительного просмотра.

    closepreview(vid);
  5. Создайте videoinput объект для датчика глубины. Обратите внимание, что создается второй объект (vid2), и DeviceID 2 используется для датчика глубины.

    vid2 = videoinput('kinect',2,'Depth_640x480');
  6. Посмотрите на свойства конкретного устройства на исходном устройстве, которое является датчиком глубины на Kinect.

    src = getselectedsource(vid2);
    
    src
    
    Display Summary for Video Source Object:
     
          General Settings:
            Parent = [1x1 videoinput]
            Selected = on
            SourceName = DepthSource
            Tag = 
            Type = videosource
     
          Device Specific Properties:
            Accelerometer = [0.0 -1.0 0.0]
            BodyPosture = Standing
            CameraElevationAngle = 4
            DepthMode = Default
            FrameRate = 30
            IREmitter = on        
            SkeletonsToTrack = [1x0 double]
            TrackingMode = off

    Как видно на выходе, датчик глубины имеет набор специфических для устройства свойств, сопоставленных с отслеживанием скелета. Эти свойства характерны для датчика глубины.

    Свойство конкретного устройства - Датчик глубиныОписание
    AccelerometerВозвращает 3D вектор данных ускорения для датчиков цвета и глубины. Данные обновляются во время работы или предварительного просмотра устройства.

    Этот дабл 1 x 3 представляет x, y, и z значения ускорения в единицах тяжести g (9.81m/s^2). Для примера,

    [0.06 -1.00 -0.09]

    представляет значения x как 0.06 g, y как -1.00 g, и z как -0.09 g.

    BodyPostureУказывает, стоят ли отслеживаемые каркасы или сидят. Значения Standing (дает 20 данных скелета точек) и Seated (дает 10-балльные данные скелета, используя индексы соединений 2 - 11). Standing является значением по умолчанию.

    Обратите внимание, что если BodyPosture установлено в Seated mode, и TrackingMode установлено в Position, никакая позиция не возвращается, так как Position - расположение тазобедренного сустава и тазобедренного сустава не отслеживается Seated режим.

    Список индексов 20 скелетных соединений см. в подразделе «BodyPosture Joint Indices» в конце этого примера.

    CameraElevationAngleУправляет углом объектива датчика. Это угол камеры относительно земли. Значение должно быть целочисленным свойством с областью значений от -27 до 27 степеней. Значение по умолчанию является последним установленным значением, поскольку это липкая настройка. Установите его, только если хотите изменить угол наклона камеры. Это свойство совместно используется также с датчиком цвета.
    DepthModeУказывает область значений глубины на карте глубины. Значения Default (область значений от 50 до 400 см) и Near (область значений от 40 до 300 см).
    FrameRateСистем координат в секунду для сбора. Это свойство доступно только для чтения и фиксировано на 30 для датчика глубины для всех форматов. Он отражает фактическую частоту систем координат при запуске.
    IREmitterУправляет тем, включен или выключен ИК-эмиттер. Значения on и off. Первоначально значение по умолчанию является on. Однако это свойство липкости, поэтому значение по умолчанию является последним заданным значением. Если установить значение off, он будет оставаться отключенным в будущем использовании, пока вы не измените настройку.

    Преимущество этого свойства в том, что оно полезно при использовании нескольких устройств Kinect, чтобы избежать помех.

    SkeletonsToTrackУказывает идентификатор отслеживания скелета, возвращенный как часть метаданных. Значения:

    [] Отслеживание по умолчанию

    [TrackingID1] Отследите 1 скелет с идентификатором отслеживания = TrackingID1

    [TrackingID1 TrackingID2] Отследите 2 скелета с идентификаторами отслеживания = TrackingID1 и TrackingID2

    TrackingModeУказывает на состояние отслеживания. Значения:

    Skeleton отслеживает полный скелет с шарнирами

    Position отслеживает только положение тазобедренного сустава

    Off отключает отслеживание положения скелета (по умолчанию)

    Обратите внимание, что если BodyPosture установлено в Seated mode, и TrackingMode установлено в Position, никакая позиция не возвращается, так как Position - расположение тазобедренного сустава и тазобедренного сустава не отслеживается Seated режим.

  7. Запуск второго videoinput объект (поток глубины).

    start(vid2);
  8. Доступ к скелетным данным осуществляется в виде метаданных по потоку глубин. Можно использовать getdata для доступа к нему.

    % Get the data on the object.
    [frame, ts, metaData] = getdata(vid2);
    
    % Look at the metadata to see the parameters in the skeletal data.
    metaData
    
    metaData = 
     
    10x1 struct array with fields:
        AbsTime: [1x1 double]
        FrameNumber: [1x1 double]
        IsPositionTracked: [1x6 logical]
        IsSkeletonTracked: [1x6 logical] 
        JointDepthIndices: [20x2x6 double]
        JointImageIndices: [20x2x6 double]
        JointTrackingState: [20x6 double]
        JointWorldCoordinates: [20x3x6 double]
        PositionDepthIndices: [2x6 double]
        PositionImageIndices: [2x6 double]
        PositionWorldCoordinates: [3x6 double]
        RelativeFrame: [1x1 double]
        SegmentationData: [640x480 double]
        SkeletonTrackingID: [1x6 double]
        TriggerIndex: [1x1 double]

    Эти поля метаданных связаны с отслеживанием скелетов.

    Метаданные Описание
    AbsTimeЭто дабл 1 x 1 и представляет полную временную метку, включая дату и время, в формате часов MATLAB.
    FrameNumberЭто дабл 1 x 1 и представляет номер системы координат.
    IsPositionTrackedЭто логическая матрица 1 x 6 с истинными/ложными значениями для отслеживания положения каждого из шести скелетов. A 1 указывает, что положение отслеживается и 0 указывает, что это не так.
    IsSkeletonTrackedЭто логическая матрица 1 x 6 с значениями true/false для отслеженного состояния каждого из шести скелетов. A 1 указывает, что он отслеживается и 0 указывает, что это не так.
    JointDepthIndicesЕсли на BodyPosture для свойства задано значение Standing, это 20 x 2 x 6 двойная матрица координат X-и Y-для 20 соединений в пикселях относительно изображения глубины для шести возможных скелетов. Если BodyPosture установлено в Seated, это будет 10 x 2 x 6 двойной для 10 соединений.
    JointImageIndicesЕсли на BodyPosture для свойства задано значение Standing, это 20 x 2 x 6 двойная матрица координат X-и Y-для 20 соединений в пикселях относительно цветного изображения для шести возможных скелетов. Если BodyPosture установлено в Seated, это будет 10 x 2 x 6 двойной для 10 соединений.
    JointTrackingStateЭта 20 x 6 целочисленная матрица содержит перечисленные значения для точности отслеживания каждого соединения для всех шести скелетов. Значения включают:

    0 не отслеживается

    1 позиция, выведенная

    2 отслеживаемая позиция

    JointWorldCoordinatesЭто двойная матрица 20 x 3 x 6 с координатами x -, y - и z для 20 соединений в метрах от датчика для шести возможных скелетов, если BodyPosture установлено в Standing. Если установлено значение Seated, это будет 10 x 3 x 6 двойной для 10 соединений.

    Синтаксис этих данных см. в шаге 9.

    PositionDepthIndicesДвойная матрица 2 x 6 координат X и Y каждого скелета в пикселях относительно изображения глубины.
    PositionImageIndicesДвойная матрица 2 x 6 координат X и Y каждого скелета в пикселях относительно цветного изображения.
    PositionWorldCoordinatesМатрица с 3 x 6 двойными координатами X, Y и Z каждого скелета в метрах относительно датчика.
    RelativeFrameЭто число 1 x 1 double представляет номер системы координат относительно выполнения триггера, если используется триггер.
    SegmentationDataРазмер изображения двойной массив с каждым пикселем, сопоставленным с отслеженным/обнаруженным скелетом, представленным числами, 1 к 6. Эта карта сегментации является растровым изображением с пиксельными значениями, соответствующими индексу человека в поле зрения, который находится ближе всего к камере в этом пиксельном положении. Значение 0 означает, что отслеживаемый каркас отсутствует.
    SkeletonTrackingIDЭта целочисленная матрица 1 x 6 содержит идентификаторы отслеживания всех шести скелетов. Эти идентификаторы отслеживают определенные скелеты, используя SkeletonsToTrack свойство на шаге 5.

    Идентификаторы отслеживания генерируются Kinect и изменяются с приобретения на приобретение.

    TriggerIndexЭто дабл 1 x 1, представляющий триггер, с которым связано событие, если используется триггер.
  9. Можно просмотреть любое отдельное свойство, просверлив метаданные. Для примера посмотрите на IsSkeletonTracked свойство.

    metaData.IsSkeletonTracked
    
    ans = 
     
         1     0     0     0     0     0

    В этом случае это означает, что из шести возможных каркасов отслеживается один каркас, и он находится в первом положении. Если у вас есть несколько скелетов, это свойство полезно для подтверждения того, какие из них отслеживаются.

  10. Получите местоположения соединений для первого лица в мировых координатах с помощью JointWorldCoordinates свойство. Поскольку это лицо в позиции 1, индекс использует 1.

    metaData.JointWorldCoordinates(:,:,1)
    
    ans =
     
       -0.1408   -0.3257    2.1674
       -0.1408   -0.2257    2.1674
       -0.1368   -0.0098    2.2594
       -0.1324    0.1963    2.3447
       -0.3024   -0.0058    2.2574
       -0.3622   -0.3361    2.1641
       -0.3843   -0.6279    1.9877
       -0.4043   -0.6779    1.9877
        0.0301   -0.0125    2.2603
        0.2364    0.2775    2.2117
        0.3775    0.5872    2.2022
        0.4075    0.6372    2.2022
       -0.2532   -0.4392    2.0742
       -0.1869   -0.8425    1.8432
       -0.1869   -1.2941    1.8432
       -0.1969   -1.3541    1.8432
       -0.0360   -0.4436    2.0771
        0.0382   -0.8350    1.8286
        0.1096   -1.2114    1.5896
        0.1196   -1.2514    1.5896

    Столбцы представляют координаты X, Y и Z в метрах из 20 точек на каркасе 1.

  11. Можно опционально просмотреть данные сегментации как изображение.

    % View the segmentation data as an image.
    imagesc(metaDataDepth.SegmentationData);
    % Set the color map to jet to color code the people detected.
    colormap(jet);
    

Индексы соединений BodyPosture

The BodyPosture свойство на шаге 5 указывает, стоят ли отслеживаемые скелеты или сидят. Значения Standing (дает 20 данных скелета точек) и Seated (дает 10-балльные данные скелета, используя индексы соединений 2 - 11).

Таков порядок соединений, возвращаемых адаптером Kinect:

   Hip_Center = 1;
   Spine = 2;
   Shoulder_Center = 3;
   Head = 4;
   Shoulder_Left = 5;
   Elbow_Left = 6;
   Wrist_Left = 7;
   Hand_Left = 8;
   Shoulder_Right = 9;
   Elbow_Right = 10;
   Wrist_Right = 11;
   Hand_Right = 12;
   Hip_Left = 13;
   Knee_Left = 14;
   Ankle_Left = 15;
   Foot_Left = 16; 
   Hip_Right = 17;
   Knee_Right = 18;
   Ankle_Right = 19;
   Foot_Right = 20;

Когда BodyPosture установлено в Standingвсе 20 индексов возвращаются, как показано выше. Когда BodyPosture установлено в Seatedвозвращаются числа от 2 до 11, поскольку это представляет верхнюю часть каркаса.

Примечание

Чтобы понять различия в использовании адаптера Kinect по сравнению с предыдущими адаптерами тулбокса, смотрите Важную информацию о адаптере Kinect. Дополнительные сведения об обнаружении устройств Kinect и использовании двух идентификаторов устройств см. в разделе Обнаружение устройств Kinect. Пример одновременного приобретения см. в разделе Приобретение из устройств цвета и глубины одновременно.