我有一个与kinect的学期项目。我必须改进某个应用程序并为其添加新功能。由于应用程序使用了过时的kinect sdk,因此出现了问题。我希望(个人)添加的一些额外功能需要使用新的Kinect SDK。从Kinect SDK Beta转移到最新的SDK是否有任何快速指南?
除了程序集引用以外,还进行了哪些更改?
最佳答案
我从post上找到了以下信息:
此处和此处提供的所有信息归功于该文章的原始海报。我只是在分享他的知识
如果您在2月1日之前使用Kinect SDK的Beta 2,则可能会对v1中引入的API更改次数感到沮丧。
为了获得左右关节,您以前编写的代码
Joint jointRight = sd.Joints[JointID.HandRight];
Joint jointLeft = sd.Joints[JointID.HandLeft];
首先,您需要创建一个骨架
Skeleton[] skeletons = new Skeleton[0];
然后你必须越过骨架
foreach (Skeleton skel in skeletons)
然后你得到的关节
Joint rightHand = skeleton.Joints[JointType.HandRight];
Joint leftHand = skeleton.Joints[JointType.HandLeft];
用来写相机的高度
_nui.NuiCamera.ElevationAngle = 17;
现在,您只需使用创建的传感器(下面将介绍如何替换运行时类),然后编写
sensor.ElevationAngle = 17;
操纵彩色图像框
这是之前必须写的
rawImage.Source = e.ColorImageFrame.ToBitmapSource();
现在,您必须打开colorimage框架并检查是否返回了某些内容,然后再执行上述操作。转换为位图源也已更改。转型就是这样
using (var videoFrame = e.OpenColorImageFrame())
{
if (videoFrame != null)
{
var bits = new byte[videoFrame.PixelDataLength];
videoFrame.CopyPixelDataTo(bits);
}
}
但是,在将多个Kinect应用程序从beta 2移植到v1之后,我终于开始看到这种变化的模式。在大多数情况下,只需将一组样板代码替换为另一组样板代码即可。代码的任何唯一部分在大多数情况下都可以保留。
在本文中,我想演示五个简单的代码转换,这些转换将简化您从beta 2到Kinect SDK v1的方式。我将逐个片段地进行重复。
命名空间已转移。 Microsoft.Research.Kinect.Nui现在只是Microsoft.Kinect。幸运的是,Visual Studio使解析名称空间相对容易,因此我们可以继续进行。
运行时类型(用于处理来自Kinect的数据流的控制器对象)现在称为KinectSensor类型。抓住它的一个实例也已经改变。您以前只是像这样新建实例:
Runtime nui = new Runtime();
现在,您改为从包含与计算机相连的所有KinectSensor的静态数组中获取KinectSensor的实例。
KinectSensor sensor = KinectSensor.KinectSensors[0];
初始化KinectSensor对象以开始读取颜色流,深度流或骨架流也已更改。在Beta 2中,.NET-y的初始化过程看起来并不十分。在v1中,此问题已得到彻底清除。用于初始化深度和骨架流的beta 2代码如下所示:
_nui.SkeletonFrameReady += new EventHandler( _nui_SkeletonFrameReady ); _nui.DepthFrameReady += new EventHandler( _nui_DepthFrameReady ); _nui.Initialize(RuntimeOptions.UseDepth, RuntimeOptions.UseSkeletalTracking); _nui.DepthStream.Open(ImageStreamType.Depth , 2 , ImageResolution.Resolution320x240 , ImageType.DepthAndPlayerIndex);
在v1中,此样板代码已更改,因此Initialize方法消失了,大致由Start方法代替。依次将流上的Open方法替换为Enable。只需启用骨架流,即可使DepthAndPlayerIndex数据可用。还要注意,深度和颜色流的事件参数类型现在不同。这是v1中的相同代码:
sensor.SkeletonFrameReady +=
new EventHandler<SkeletonFrameReadyEventArgs>(
sensor_SkeletonFrameReady
);
sensor.DepthFrameReady +=
new EventHandler<DepthImageFrameReadyEventArgs>(
sensor_DepthFrameReady
);
sensor.SkeletonStream.Enable();
sensor.DepthStream.Enable(
DepthImageFormat.Resolution320x240Fps30
);
sensor.Start();
转换平滑:以前非常容易平滑beta 2中的骨架流。您只需打开它即可。
nui.SkeletonStream.TransformSmooth = true;
在v1中,您必须创建一个新的TransformSmoothParameters对象,并将其传递给框架流的enable属性。与beta 2不同,您还必须自行初始化值,因为它们均默认为零。
sensor.SkeletonStream.Enable(
new TransformSmoothParameters()
{ Correction = 0.5f
, JitterRadius = 0.05f
, MaxDeviationRadius = 0.04f
, Smoothing = 0.5f });
流事件处理:处理深度流,视频流和框架流中的就绪事件过去也非常容易。以下是在Beta 2中处理DepthFrameReady事件的方式(骨骼和视频遵循相同的模式):
void _nui_DepthFrameReady(object sender , ImageFrameReadyEventArgs e) { var frame = e.ImageFrame; var planarImage = frame.Image; var bits = planarImage.Bits; // your code goes here }
出于性能原因,较新的v1代码看起来非常不同,并且底层C ++ API会泄漏一点点。在v1中,我们需要打开图像框架并检查以确保返回了某些内容。此外,我们创建自己的字节数组(对于深度流,它已成为短裤数组),并从帧对象中填充它。您可能已经在beta 2中熟悉的PlanarImage类型已完全消失。还要注意使用using关键字处理ImageFrame对象。上面代码的音译现在看起来像这样:
void sensor_DepthFrameReady(object sender
, DepthImageFrameReadyEventArgs e)
{
using (var depthFrame = e.OpenDepthImageFrame())
{
if (depthFrame != null)
{
var bits =
new short[depthFrame.PixelDataLength];
depthFrame.CopyPixelDataTo(bits);
// your code goes here
}
}
}
我注意到,许多使用Kinect SDK beta 2的站点和库仍未移植到Kinect SDK v1。考虑到API似乎已更改了多少,我当然可以理解。
不过,如果您遵循这五个简单的翻译规则,则可以非常快速地转换大约80%的代码。
关于c# - 将代码从kinect sdk beta转换为最新的kinect sdk的完整指南,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13380619/