exponenta event banner

Получение изображений и скелетных данных с помощью 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/10000 секунды. Диапазон значений: 0 кому 4000, и по умолчанию 0.

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

    FrameIntervalУказывает интервал кадра в единицах 1/10000 секунды. Диапазон значений: 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 режим, и TrackingMode имеет значение Position, позиция не возвращается, так как Position - местоположение тазобедренного сустава, и тазобедренный сустав не отслеживается в Seated режим.

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

    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 режим, и 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 значений true/false для отслеживания положения каждого из шести скелетов. 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 двойной представляет номер кадра относительно выполнения триггера, если используется триггер.
    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

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. Пример одновременного получения см. в разделе Одновременное получение из устройств цвета и глубины.