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