主要内容

从图像采集工具箱中使用windowsv1版本的Kinect

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

效用函数

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

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

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

Windows传感器的Kinect在IMAQHWINFO中显示为两个独立的设备。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' 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'}

获取颜色和深度数据

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

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

将VIDEOINPUT对象的FramesPerTrigger属性设置为‘100’,以便每个触发器获得100帧。在这个例子中,获取100帧给Windows Kinect传感器足够的时间开始跟踪骨骼。

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)
视频源对象的显示摘要:一般设置:Parent = [1x1 videoinput] Selected = on SourceName = Depth Source Tag = Type = videosource设备特定属性:Accelerometer = [-0.008547 -0.98046 -0.11966] BodyPosture = Standing CameraElevationAngle = 9 DepthMode = Default FrameRate = 30 IREmitter = on SkeletonsToTrack = [1x0 double] TrackingMode = Off

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

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

BodyPosture属性决定了跟踪的关节数量。如果“BodyPosture”设置为“Standing”,则跟踪20个关节。如果它被设置为“坐姿”,那么将跟踪10个关节。

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

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

骨骼数据的访问

Windows Kinect产生的骨架数据可以通过深度设备访问,作为GETDATA返回的元数据的一部分。Windows版本的Kinect可以追踪视野内最多六个人的位置,还可以主动追踪六具骨架中两具的关节位置。它还支持基于人们是站着还是坐着的两种跟踪模式。在站立模式下,完整的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结构数组的字段:AbsTime FrameNumber IsPositionTracked isskeleton ontracked JointDepthIndices JointImageIndices JointTrackingState JointWorldCoordinates PositionDepthIndices positionimageindexes PositionWorldCoordinates RelativeFrame SegmentationData骨架trackingid TriggerIndex

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

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

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

看看哪些骨骼被追踪过。trackedSkeletons =找到(metaDataDepth (95) .IsSkeletonTracked)
trackedSkeletons = 1

显示骨骼的关节坐标。注意,如果'BodyPosture'属性被设置为' sitting ', '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.0033 0.6430 2.0740 -0.1886 0.3048 2.0469 -0.1768 1.9277 -0.3855 -0.2448 1.8972 0.1724 -0.1768 0.3022 2.0449 0.3102 0.0382 2.0304 0.3740 -0.1929 1.9591 0.3786 -0.2625 1.9356 -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 243 219 303 216 323 363 177 399 243 421 303 424 322 296 277 286 387 288 492 286 520 277 342 384 347 493 350 522

在相应的彩色图像上绘制骨架

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

Baidu
map