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