主要内容

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

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

效用函数

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

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

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

在IMAQHWINFO中,Windows传感器的Kinect显示为两个独立的设备。hwInfo = imaqhwinfo (“kinect”
hwInfo = AdaptorDllName: [1x68 char] AdaptorDllVersion: '4.5 (R2013a pre - release)' AdaptorName: 'kinect' DeviceIDs: {[1] [2]} DeviceInfo: [1x2 struct]
hwInfo.DeviceInfo (1)
ans = DefaultFormat: 'RGB_640x480' DeviceFile金宝appSupported: 0 DeviceName: 'Kinect颜色传感器' DeviceID: 1 VideoInputConstructor: 'videoinput(' Kinect ', 1)' VideoDeviceConstructor: 'imaq。VideoDevice('kinect', 1)' 金宝appSupportedFormats: {1x7 cell}
hwInfo.DeviceInfo (2)
ans = DefaultFormat: 'Depth_640x480' DeviceFile金宝appSupported: 0 DeviceName: 'Kinect深度传感器' DeviceID: 2 VideoInputConstructor: 'videoinput(' Kinect ', 2)' VideoDeviceConstructor: 'imaq. txt ';VideoDevice('kinect', 2)' 金宝app' SupportedFormats: {'Depth_320x240' 'Depth_640x480' ' 'Depth_80x60'}

获取颜色和深度数据

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

%为两个流创建VIDEOINPUT对象colorVid = videoinput (“kinect”, 1)
使用“Kinect颜色传感器”的视频输入对象综述。采集源:可提供颜色源。采集参数:“颜色源”是当前选择的源。使用选定的源,每个触发器10帧。'RGB_640x480'视频数据将被记录在START。每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对象的FramesPerTrigger属性设置为'100',以便每个触发器获取100帧。在这个例子中,我们获取了100帧帧,让Kinect的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带有字段的结构数组:abtime FrameNumber IsPositionTracked isskeleton ontracked JointDepthIndices JointImageIndices JointTrackingState JointWorldCoordinates PositionDepthIndices PositionImageIndices PositionWorldCoordinates RelativeFrame SegmentationData SkeletonTrackingID TriggerIndex

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

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

以上结果表明,至少有一个骨架被跟踪。如果跟踪是启用的,但TrackingID属性没有指定id, Windows软件的Kinect会自动选择至多两个骨架来跟踪。使用IsSkeletonTracked元数据来确定正在跟踪哪些骨架。

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

显示骨骼的关节坐标。注意,如果“BodyPosture”属性被设置为“Seated”,“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色框image = frameDataColor(:,:,:, 95);找到被追踪的骷髅数量nSkeleton =长度(trackedSkeletons);绘制骨架util_skeletonViewer (jointIndices、图像、nSkeleton);