В этом примере показано, как получить данные с сенсора Kinect for Windows V1 с помощью панели инструментов получения изображений:
Чтобы сохранить этот пример максимально простым, были созданы некоторые служебные функции для работы с метаданными Kinect for Windows. Эти функции включают в себя функцию skeletingViewer, которая принимает данные скелета, цветное изображение и количество скелетов в качестве входных данных и отображает скелет, наложенный на цветное изображение.
Kinect для Windows имеет два датчика, датчик цвета и датчик глубины. Чтобы включить независимое получение от каждого из этих устройств, они рассматриваются как два независимых устройства в панели инструментов получения изображений. Это означает, что для каждого из устройств цвета и глубины (ИК) необходимо создать отдельный объект VIDEOINPUT.
% 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 определяет, включено ли отслеживание скелета, и, если оно включено, отслеживаются ли все суставы, «Скелет» или отслеживается только положение бедра, «Положение». Установка для TrackingMode значения «off» (по умолчанию) отключает отслеживание и снижает нагрузку на ЦП.
Свойство «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 для Windows автоматически выбирает для отслеживания до двух каркасов. Метаданные IsSkeletonTracked используются для определения отслеживаемых каркасов.
% See which skeletons were tracked.
trackedSkeletons = find(metaDataDepth(95).IsSkeletonTracked)
trackedSkeletons =
1
Отображение координат соединения скелета. Обратите внимание, что если свойству 'BodyPosture' присвоено значение 'Seated', то 'JointCoordinats' и '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);
