Получение изображения и скелетных данных Используя 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Указывает, стоят ли отслеженные skeletons или находятся. Значениями является Standing (дает 20 скелетных данных о точке), и Seated (дает 10 скелетных данных о точке, с помощью объединенных индексов 2 - 11). Standing является значением по умолчанию.

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

    Смотрите подраздел “Индексы Соединения BodyPosture” в конце этого примера для списка индексов 20 скелетных соединений.

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

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

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

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

    Дорожка [TrackingID1] 1 скелет с Отслеживанием ID = TrackingID1

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

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

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

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

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

    Обратите внимание на то, что, если BodyPosture установлен в режим Seated, и 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]

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

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

    0, не прослеженный

    Положение 1 выведено

    Положение 2 прослежено

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

    Смотрите шаг 9 для синтаксиса о том, как видеть эти данные.

    PositionDepthIndices2 x 6 двойных матриц координат X и Y каждого скелета в пикселях относительно изображения глубины.
    PositionImageIndices2 x 6 двойных матриц координат X и Y каждого скелета в пикселях относительно цветного изображения.
    PositionWorldCoordinates3 x 6 двойных матриц этих X, Y и координат Z каждого скелета в метрах относительно датчика.
    RelativeFrameЭтот 1 x 1 двойное представляет номер кадра относительно выполнения триггера, если инициирование используется.
    SegmentationDataДвойной массив размера изображения с каждым пикселем, сопоставленным с, отследил/обнаружил скелет, представленный числами 1 - 6. Эта карта сегментации является битовым массивом с пиксельными значениями, соответствующими индексу человека в области того, кто является самым близким к камере в том положении пикселя. Значение 0 средних значений там не является никаким отслеженным скелетом.
    SkeletonTrackingIDЭтот 1 x 6 целочисленных матриц содержит идентификаторы отслеживания всех шести skeletons. Эти идентификаторы отслеживают определенный skeletons использование свойства SkeletonsToTrack на шаге 5.

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

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

    metaData.IsSkeletonTracked
    
    ans = 
     
         1     0     0     0     0     0

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

  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

Свойство BodyPosture, на шаге 5, указывает, стоят ли отслеженные skeletons или находятся. Значениями является 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. Для примера одновременного приобретения смотрите Получение от Устройств Цвета и Глубины Одновременно.