c# - 将代码从kinect sdk beta转换为最新的kinect sdk的完整指南

标签 c# .net kinect kinect-sdk

我有一个与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/

相关文章:

c# - Asp.net将类库中的js编译为嵌入资源,其中包含c#代码

java - 将整个 kinect 骨架放置在 3D 空间的中心

kinect - OpenNI RedistMaker - 在 Mac OS 上构建失败

c++ - 如何在 Windows 和 Visual Studio 2010 中安装 Openni?

javascript - 为什么我的 C# 函数不从 ajax Javascript 代码执行?

c# - Telerik GridDateTimeColumn 中垂直堆叠日期范围过滤器

c# - 如何通过EnterpriseLibrary以编程方式读取错误日志?

c# - 当有多个using语句时,它们会按顺序执行吗?

c# - 如何在设计 View 中为自定义控件添加边框?

.net - 有人在实际应用中使用 AODL 吗?