主要内容

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

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

效用函数

为了使这个例子尽可能简单,我们创建了一些用于处理Kinect for Windows元数据的实用函数。这些实用函数包括skeleton viewer函数,它接受骨架数据、彩色图像和骨架数量作为输入,并显示覆盖在彩色图像上的骨架

看看Kinect的Windows设备和格式是可用的

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

Kinect for Windows Sensor在IMAQHWINFO中显示为两个独立的设备。hwInfo = imaqhwinfo(“kinect”
hwInfo = AdaptorDllName: [1x68 char] AdaptorDllVersion: '4.5 (R2013a预发布)' AdaptorName: 'kinect' deviceid: {[1] [2]} DeviceInfo: [1x2 struct]
hwInfo.DeviceInfo (1)
ans = DefaultFormat: 'RGB_640x480' DeviceFile万博1manbetxSupported: 0 DeviceName: 'Kinect Color Sensor' DeviceID: 1 VideoInputConstructor: 'videoinput(' Kinect ', 1)' VideoDeviceConstructor: 'imaq。VideoDevice('kinect', 1)'支万博1manbetx持格式:{1x7 cell}
hwInfo.DeviceInfo (2)
ans = DefaultFormat: 'Depth_640x480' DeviceFile万博1manbetxSupported: 0 DeviceName: 'Kinect深度传感器' DeviceID: 2 VideoInputConstructor: 'videoinput(' Kinect ', 2)' VideoDeviceConstructor: 'imaq。VideoDevice('kinect', 2)' 万博1manbetxSupportedFormats: {'Depth_320x240' 'Depth_640x480' 'Depth_80x60'}

获取颜色和深度数据

为了获得同步的颜色和深度数据,我们必须使用手动触发而不是立即触发。在执行同步采集时,默认的即时触发会在流之间产生延迟。这是由于按顺序启动流的开销。

为两个流创建VIDEOINPUT对象colorVid = videoinput(“kinect”, 1)
使用“Kinect颜色传感器”的视频输入对象概述。采集源:颜色源可用。采集参数:“颜色源”为当前选中的光源。使用所选源每个触发器10帧。'RGB_640x480'视频数据将记录在开始。抓取第一个每1帧(s)。在触发时将数据记录到“内存”。触发参数:启动时1个“立即”触发器。状态:等待启动。启动后获得0帧。 0 frames available for GETDATA.
depthVid = videoinput(“kinect”, 2)
“Kinect深度传感器”视频输入对象概述。采集源:深度源可用。采集参数:“深度源”是当前选中的源。使用所选源每个触发器10帧。'Depth_640x480'视频数据将被记录在开始。抓取第一个每1帧(s)。在触发时将数据记录到“内存”。触发参数:启动时1个“立即”触发器。状态:等待启动。启动后获得0帧。 0 frames available for GETDATA.
%设置触发模式为手动triggerconfig ([colorVid depthVid),“手动”);

将VIDEOINPUT对象的FramesPerTrigger属性设置为'100'以每次触发获取100帧。在这个例子中,获取了100帧,让Kinect for Windows传感器有足够的时间开始跟踪骨架。

colorVid。FramesPerTrigger = 100;depthVid。FramesPerTrigger = 100;
启动颜色和深度设备。这开始了习得,但并没有开始记录所获取的数据。开始([colorVid depthVid]);
触发设备开始记录数据。触发([colorVid depthVid]);
检索获取的数据[colorFrameData,colorTimeData,colorMetaData] = getdata(colorVid);[depthFrameData,depthTimeData,depthMetaData] = getdata(depthVid);
%停止设备停止([colorVid depthVid]);

配置骨架跟踪

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

从深度设备的VIDEOINPUT对象中获取VIDEOSOURCE对象。depthSrc = getselectedsource(depthVid)
视频源显示摘要对象:一般设置:Parent = [1x1 videoinput] Selected = on SourceName = Depth Source Tag = Type = videosource设备特定属性:加速度计= [-0.008547 -0.98046 -0.11966]BodyPosture = Standing CameraElevationAngle = 9 DepthMode = Default FrameRate = 30 IREmitter = on SkeletonsToTrack = [1x0 double] TrackingMode = Off

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

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

' BodyPosture '属性决定追踪多少关节。如果“BodyPosture”设置为“Standing”,则跟踪20个关节。如果将其设置为“sitting”,则跟踪10个关节。

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

%打开骨骼跟踪。depthSrc。TrackingMode =“骨架”

访问骨架数据

Kinect for Windows生成的骨架数据可以作为GETDATA返回的元数据的一部分从深度设备访问。Windows Kinect可以追踪视野中最多六个人的位置,还可以主动追踪六具骨架中两具的关节位置。它还支持两种基于万博1manbetx站立或坐着的跟踪模式。在站立模式下,跟踪并返回全部20个关节位置;在坐姿模式下,上半身的10个关节被复位。有关骨骼数据的更多细节,请参阅Kinect For Windows适配器的MATLAB文档。

在跟踪开启的情况下获得100帧。记得要有一个人在人的面前。% Kinect for Windows查看有效的跟踪数据。colorVid。FramesPerTrigger = 100;depthVid。FramesPerTrigger = 100;
开始([colorVid depthVid]);触发([colorVid depthVid]);
检索框架并检查是否有骨架被跟踪。[frameDataColor] = getdata(colorVid);[frameDataDepth, timeDataDepth, metaDataDepth] = getdata(depthVid);
从深度元数据中查看骨架数据metaDataDepth
metaDataDepth = 100x1带字段的结构数组:AbsTime FrameNumber IsPositionTracked isskeletal tracked JointDepthIndices JointImageIndices JointTrackingState JointWorldCoordinates PositionDepthIndices PositionImageIndices PositionWorldCoordinates RelativeFrame SegmentationData SkeletonTrackingID TriggerIndex

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

从深度元数据中检查跟踪骨架。anyPositionsTracked = any(metaDataDepth(95)。IsPositionTracked ~= 0) anyskeletonstracks = any(metaDataDepth(95). IsPositionTracked ~= 0)isskeletal ontracked ~= 0)
anypositionstracks = 1 anyskeletonstracks = 1

上面的结果表明,至少有一个骨架正在被跟踪。如果跟踪已启用,但TrackingID属性未指定id, Kinect for Windows软件将自动选择最多两个骨架进行跟踪。使用isskeletal ontracked元数据来确定哪些骨架正在被跟踪。

看看哪些骷髅被追踪了。。trackedskeleton = find(metaDataDepth(95). isskeletal tracked)
trackedskeleton = 1

显示骨骼的关节坐标。注意,如果'BodyPosture'属性被设置为' sitting ', 'JointCoordinates'和'JointIndices'仍然有20的长度,但是指数2-11(上肢关节)将单独被填充。

jointCoordinates = metaDataDepth(95)。JointWorldCoordinates(:,:, trackedskeleton)%骨架相对于彩色图像的关节指数jointIndices =元数据深度(95)。JointImageIndices(:,:, trackedskeleton)
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.3740 -0.1929 1.9591 -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.0885 -0.9321 1.8266 jointIndices = 318 256 317 240 318143 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个彩色帧image = frameDataColor(:,:,:, 95);找到被追踪骷髅的数量nSkeleton = length(trackedskeleton);绘制骨架util_skeletal viewer (jointIndices, image, nSkeleton);