主要内容

使用图像采集工具箱™中的Kinect®for Windows®V1

这个例子展示了如何使用Image Acquisition Toolbox从Windows V1的Kinect传感器获取数据:

效用函数

为了在保持这个例子尽可能简单,元数据已经创造了与Kinect的工作适用于Windows的一些实用功能。这些实用程序的功能包括,它接受作为在彩色图像上的输入和显示的骨架覆盖骨架数据,彩色图像和数量骨架的skeletalViewer功能

查看适用于Windows设备和格式的Kinect

Windows版Kinect有两个传感器,一个是颜色传感器,一个是深度传感器。为了能够从这些设备中独立采集,在图像采集工具箱中将它们视为两个独立的设备。这意味着需要为每个颜色和深度(IR)设备创建单独的VIDEOINPUT对象。

在IMAQHWINFO中,Windows传感器的Kinect显示为两个独立的设备。hwInfo = imaqhwinfo (“kinect”
HWINFO = AdaptorDllName:[1x68字符] AdaptorDllVersion: '4.5(R2013a预发行)' AdaptorName: '超高动力学' DeviceIDs:{[1] [2]} DeviceInfo:[1×2结构]
hwInfo.DeviceInfo(1)
ANS = DefaultFormat: 'RGB_640x480' DeviceFile金宝appSupported:0设备名称: '超高动力学颜色传感器' 的DeviceID:1个VideoInputConstructor: 'videoinput(' 的kinect '1)' VideoDeviceConstructor: 'imaq.VideoDevice(' 的kinect '1)' SupportedFormats:{1X7细胞}
hwInfo.DeviceInfo(2)
ANS = DefaultFormat: 'Depth_640x480' DeviceFile金宝appSupported:0设备名称: '超高动力学深度传感器' 的DeviceID:2 VideoInputConstructor: 'videoinput(' 的kinect '2)' VideoDeviceConstructor: 'imaq.VideoDevice(' 的kinect '2)' SupportedFormats:{”Depth_320x240' Depth_640x480 'Depth_80x60'}

获取颜色和深度数据

为了获取同步的颜色和深度数据,必须用手动触发的,而不是立即触发。在执行同步获取从一个滞后流之间的默认立即触发缺点。这是由于开销顺序流的开始。

%为两个流创建VIDEOINPUT对象colorVid = videoinput (“kinect”, 1)
视频输入对象使用“Kinect的颜色传感器”的总结。采集来源(S):颜色源可用。采集参数:“颜色来源”是当前选定的来源。使用选定的源,每个触发器10帧。在一开始就被记录“RGB_640x480”的视频数据。每1帧抓取第一个帧。在触发器上记录数据到“内存”。触发器参数:START上的1个“immediate”触发器。状态:等待启动。0帧从开始。 0 frames available for GETDATA.
depthVid = videoinput (“kinect”, 2)
使用Kinect深度传感器的视频输入对象概述。采集源:提供深度源。采集参数:“深度源”是当前选择的源。使用选定的源,每个触发器10帧。'Depth_640x480'视频数据将被记录在START。每1帧抓取第一个帧。在触发器上记录数据到“内存”。触发器参数:START上的1个“immediate”触发器。状态:等待启动。0帧从开始。 0 frames available for GETDATA.
将触发模式设置为“手动”triggerconfig([colorVid depthVid]'手动的');

设置VIDEOINPUT对象到“100”的FramesPerTrigger属性获取每触发器100帧。在此实例中100个帧被获取以得到超高动力学为Windows传感器足够的时间以开始跟踪的骨架。

colorVid.FramesPerTrigger = 100;depthVid.FramesPerTrigger = 100;
%启动颜色和深度的设备。这开始收购,但不%开始记录采集的数据。开始([colorVid depthVid]);
触发设备开始记录数据。触发器([colorVid depthVid]);
%检索已获取的数据[colorFrameData, colorTimeData colorMetaData] = getdata (colorVid);[depthFrameData, depthTimeData depthMetaData] = getdata (depthVid);
%停止设备止动件([colorVid depthVid]);

配置骨架跟踪

Windows传感器的Kinect提供了不同的模式来跟踪骨骼。这些模式可以通过深度设备的VIDEOSOURCE对象访问和配置。让我们看看如何启用骨架跟踪。

%获取从深度设备的VIDEOINPUT对象VIDEOSOURCE对象。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 iireter = on SkeletonsToTrack = [1x0 double] TrackingMode = Off

深度源对象上控制骨骼跟踪特性的属性是VIDEOSOURCE上的TrackingMode、SkeletonToTrack和BodyPosture属性。

TrackingMode控制是否启用骨骼跟踪,如果启用,是否跟踪所有关节,“骨骼”,或者如果只跟踪髋关节位置,“位置”。将TrackingMode设置为' off '(默认)禁用所有跟踪并减少CPU负载。

“BodyPosture”属性决定有多少关节被跟踪。如果“BodyPosture”设置为“Standing”,则跟踪20个关节。如果它被设置为“坐姿”,那么十个关节被跟踪。

SkeletonToTrack属性可以使用“SkeletonTrackingID”选择性地跟踪一个或两个骨架。'SkeletonTrackingID'的当前有效值将作为深度设备元数据的一部分返回。

开启骨骼追踪。depthSrc。TrackingMode ='骨骼';

访问骨骼数据

Windows Kinect生成的基本数据可以作为GETDATA返回的元数据的一部分从深度设备访问。Windows版的Kinect最多可以跟踪6个人的位置,还可以主动跟踪6个骨架中的2个的关节位置。它还支持两种基于金宝app人们是站着还是坐着的跟踪方式。在站立模式下,跟踪并返回完整的20个关节位置;在坐式模式下,返回10个上体关节。有关骨骼数据的更多细节,请参阅Windows适配器Kinect的MATLAB文档。

%采集100个帧,提供跟踪接通。记得有一个人在前面% Kinect用于Windows查看有效的跟踪数据。colorVid.FramesPerTrigger = 100;depthVid.FramesPerTrigger = 100;
开始([colorVid depthVid]);触发器([colorVid depthVid]);
检索帧并检查是否有骷髅被跟踪[frameDataColor] = getdata (colorVid);[frameDataDepth, timeDataDepth, metaDataDepth] = getdata(depthVid);
%从深度元数据查看骨架数据metaDataDepth
metaDataDepth = 100X1结构阵列字段:绝对时间帧编号IsPositionTracked IsSkeletonTracked JointDepthIndices JointImageIndices JointTrackingState JointWorldCoordinates PositionDepthIndices PositionImageIndices PositionWorldCoordinates RelativeFrame SegmentationData SkeletonTrackingID TriggerIndex

我们随机选择第95帧来可视化图像和骨架数据。

%从深度元数据中检查跟踪的骨架anyPositionsTracked =任何(metaDataDepth(95).IsPositionTracked〜= 0)anySkeletonsTracked =任何(metaDataDepth(95).IsSkeletonTracked〜= 0)
anyskeletonstrackered = 1

以上的结果表明,至少一种骨架被跟踪。如果跟踪已启用,但没有标识与TrackingID属性指定,Kinect的为Windows软件会自动选择最多两个骨架追踪。使用IsSkeletonTracked元数据,以确定哪些被跟踪的骨架。

查看跟踪了哪些骷髅。trackedSkeletons =找到(metaDataDepth (95) .IsSkeletonTracked)
trackedSkeletons = 1

显示骨骼的关节坐标。注意,如果“车体姿态”属性被设置为“坐”中,“JointCoordinates”和“JointIndices”将仍具有20的长度,但指数2-11(上半身的关节)单独将被填充。

jointCoordinates = metaDataDepth(95)。JointWorldCoordinates (:,:, trackedSkeletons)骨骼的联合指数相对于彩色图像jointIndices = metaDataDepth(95)。JointImageIndices (:,:, trackedSkeletons)
联合坐标= -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.2625 1.9356 -0.0942 -0.0850 1.9540 -0.1367 -0.4957 1.9361 -0.1356 -0.87651.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

绘制骷髅在相应的彩色图像

%拔出第95彩色帧图像= frameDataColor(:,:,:,95);找到被追踪的骷髅数量nSkeleton =长度(trackedSkeletons);绘制骨架util_skeletonViewer (jointIndices、图像、nSkeleton);