从图像采集工具箱使用Kinect®适用于Windows®V1™

此示例示出了如何获得用于Windows V1可从超高动力学数据传感器使用图像采集工具箱:

效用函数

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

查看Windows设备和格式的Kinect有哪些可用

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

Windows传感器的Kinect在IMAQHWINFO中显示为两个独立的设备。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万博1manbetxSupported:0设备名称: '超高动力学颜色传感器' 的DeviceID:1个VideoInputConstructor: 'videoinput(' 的kinect '1)' VideoDeviceConstructor: 'imaq.VideoDevice(' 的kinect '1)' SupportedFormats:{1X7细胞}
hwInfo.DeviceInfo(2)
ANS = DefaultFormat: 'Depth_640x480' DeviceFile万博1manbetxSupported:0设备名称: '超高动力学深度传感器' 的DeviceID:2 VideoInputConstructor: 'videoinput(' 的kinect '2)' VideoDeviceConstructor: 'imaq.VideoDevice(' 的kinect '2)' SupportedFormats:{”Depth_320x240' Depth_640x480 'Depth_80x60'}

获取颜色和深度数据

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

创建两个流的视频输入对象colorVid = videoinput ('Kinect的',1)
视频输入对象使用“Kinect的颜色传感器”的总结。采集来源(S):颜色源可用。采集参数:“颜色来源”是当前选定的来源。每触发器10帧使用所选择的源。在一开始就被记录“RGB_640x480”的视频数据。第一,每1帧(一个或多个)的抓取。日志数据上触发“记忆”。触发参数:1“即时”扳机上启动(S)。状态:等待启动。0帧开始以来获取。 0 frames available for GETDATA.
depthVid = videoinput ('Kinect的',2)
视频输入对象使用“Kinect的深度传感器”的总结。采集来源(S):深源可用。采集参数:“深源”是当前选定的来源。每触发器10帧使用所选择的源。在一开始就被记录“Depth_640x480”的视频数据。第一,每1帧(一个或多个)的抓取。日志数据上触发“记忆”。触发参数:1“即时”扳机上启动(S)。状态:等待启动。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]);

配置骨架跟踪

Kinect的用于Windows传感器提供不同的模式来跟踪骨架。这些模式可以被访问并且从深度设备的VIDEOSOURCE对象构成。让我们来看看如何启用骨骼跟踪。

%获取从深度设备的VIDEOINPUT对象VIDEOSOURCE对象。depthSrc = getselectedsource (depthVid)
显示总结视频源对象:一般设置:家长= [1 x1 videoinput]选择= SourceName =深度源标签=类型= videosource设备特定属性:加速度计= (-0.008547 -0.98046 -0.11966)BodyPosture =站CameraElevationAngle = 9 DepthMode =默认的帧速率= 30 IREmitter = SkeletonsToTrack = [1 x0双]TrackingMode =

控制骨骼跟踪特性的depth source对象的属性是TrackingMode、SkeletonToTrack和BodyPosture属性。

TrackingMode控制是否骨架跟踪被启用,如果已启用,所有接头是否被跟踪,“白骨精”,或者只是臀部的位置进行跟踪,“位置”。设置TrackingMode到“断开”(缺省)禁用所有跟踪和减少了CPU的负荷。

该“车体姿态”属性决定许多关节是如何跟踪。如果“车体姿态”设置为“长期”,二十关节跟踪。如果它被设置为“坐”,那么10个接口被跟踪。

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

打开骨骼追踪。depthSrc.TrackingMode ='骨架';

访问骨骼数据

骨架数据,该超高动力学为Windows产生是从深度设备如由GETDATA返回的元数据的一部分进行访问。Kinect的为Windows可以跟踪多达6人在视图的位置,可积极跟踪的两个六道骸的关节位置。它还支持跟踪基于万博1manbetx他们是否是站着或坐着的人的两种模式。在站立模式下,整整20个关节位置跟踪和返回;在就座模式10个上体接头返回。有关骨骼数据的详细信息,请参阅Windows适配器上的Kinect的MATLAB文档。

%采集100个帧,提供跟踪接通。%请记住,在人一个人在前面适用于Windows的Kinect%看到有效的跟踪数据。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)
anySkeletonsTracked = 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)
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 318143 319 92 271 177 239 219 303 216 323 363 399 243 421 303 424 322 296 277 286 387 288 286 520 340 342 384 347 493 350 522

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

%拔出第95彩色帧图像= frameDataColor(:,:,:,95);骷髅%查找号码追踪nSkeleton =长度(trackedSkeletons);%绘制骨架util_skeletonViewer(jointIndices,图像,nSkeleton);