В этом примере показано, как получить данные, доступные от 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);
