В этом примере показано, как получить доступные данные из Kinect для датчика Windows V1 с помощью Image Acquisition Toolbox:
В порядке хранение этот пример, максимально простой, были созданы некоторые служебные функции для работы с Kinect для метаданных Windows. Эти служебные функции включают функцию skeletalViewer, которая принимает скелетные данные, цветное изображение и количество skeletons как входные параметры и отображает скелет, наложенный на цветном изображении
Kinect для Windows имеет два датчика, цветной датчик и датчик глубины. Чтобы включить независимое приобретение из каждого из этих устройств, они обработаны как два независимых устройства в Image Acquisition Toolbox. Это означает, что отдельный объект VIDEOINPUT должен быть создан для каждого цвета и глубины (IR) устройства.
% 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 обеспечивает различные режимы, чтобы отследить skeletons. К этим режимам можно получить доступ и сконфигурировать от объекта 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’ установлен в 'Положение', двадцать соединений прослежены. Если это установлено в 'Усаженный', то десять соединений прослежены.
Свойство SkeletonToTrack может использоваться, чтобы выборочно отследить один или два skeletons использование 'SkeletonTrackingID'. В настоящее время допустимые значения для 'SkeletonTrackingID' возвращены как часть метаданных устройства глубины.
% Turn on skeletal tracking. depthSrc.TrackingMode = 'Skeleton';
Скелетные данные, что Kinect для продуктов Windows доступен от устройства глубины как часть метаданных, возвращенных GETDATA. Kinect для Windows может отследить положение до шести человек в поле зрения и может активно отследить объединенные местоположения двух из шести skeletons. Это также поддерживает два режима отслеживания людей на основе того, стоят ли они или усаженные. В постоянном режиме все 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 автоматически разделился на команды к двум skeletons, чтобы отследить. Используйте метаданные IsSkeletonTracked, чтобы определить, какие skeletons прослеживаются.
% See which skeletons were tracked.
trackedSkeletons = find(metaDataDepth(95).IsSkeletonTracked)
trackedSkeletons = 1
Отобразите объединенные координаты скелета. Обратите внимание на то, что, если свойство 'BodyPosture' будет установлено в 'Усаженный', 'JointCoordinates' и '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);