65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 WebSocket 和 Canvas 的 Kinect 和 HTML5

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (6投票s)

2012年1月3日

CPOL

3分钟阅读

viewsIcon

60554

使用 WebSocket 和 Canvas 的 Kinect 和 HTML5

更新(2013年12月10日):想了解更多关于 WebSocket 的信息吗?请考虑我的新书,HTML5 WebSocket 编程入门

Kinect 定义了自然用户交互。HTML5 重新定义了 Web。目前,有各种教程描述了如何使用 Windows Forms 或 WPF 作为用户界面与 Kinect 传感器进行交互。但是,如果使用 Web 界面来处理 Kinect 数据呢?为了结合这两种热门的前沿技术,我想出了一个漂亮且开源的解决方案,我将在本文中描述它。

我将使用官方的 Kinect SDK 进行演示,但同样的原理也适用于 OpenNI SDK。

必备组件

结果

该项目包含两个子项目:一个使用 Kinect SDK 的服务器端应用程序,以及一个在 HTML5 canvas 上显示骨骼关节的客户端网页。

客户端应用程序

服务器应用程序

教程

以下是实现上述功能的步骤:

步骤 1:服务器应用程序

服务器应用程序的工作很简单:检测用户的关节打包数据,并使用 web sockets 将数据发送给客户端

为了检测关节的坐标,我们需要添加对首选 Kinect SDK 的引用,并处理骨骼事件。我建议使用 Microsoft SDK 而不是 OpenNI,因为它更简单。

static void Nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    List users = new List();

    foreach (var user in e.SkeletonFrame.Skeletons)
    {
        if (user.TrackingState == SkeletonTrackingState.Tracked)
        {
            users.Add(user);
        }
    }

    if (users.Count > 0)
    {
        string json = users.Serialize();

        foreach (var socket in _sockets)
        {
            socket.Send(json);
        }
    }
}

为了将数据发送给订阅的客户端,我们需要以客户端能够理解和处理的方式“打包”关节的坐标。我决定以 JSON 格式编码坐标,因为 JSON 是一种轻量级且易于理解的通过 Web 传输数据的方式。您可以在源代码文件中找到 JSON 编码器类。

考虑到数据传输,我强烈建议使用 Fleck。Fleck 基于 Nugget,是一个 C# web socket 库,它以最少的配置工作实现其功能:它使用轻量级 web sockets 将所需数据广播给订阅的客户端。以下是如何初始化 web socket 服务器:

_sockets = new List();

var server = new WebSocketServer("ws://:8181");

server.Start(socket =>
{
    socket.OnOpen = () =>
    {
        Console.WriteLine("Connected to " + socket.ConnectionInfo.ClientIpAddress);
        _sockets.Add(socket);
    };
    socket.OnClose = () =>
    {
        Console.WriteLine("Disconnected from " + socket.ConnectionInfo.ClientIpAddress);
        _sockets.Remove(socket);
    };
    socket.OnMessage = message =>
    {
        Console.WriteLine(message);
    };
});

在收集、打包和传输数据后,客户端现在可以相应地使用和处理它们。

步骤 2:客户端应用程序

现在开始处理 HTML5 部分!我们已经设置好了服务器,所以让我们添加网页客户端。HTML5 规范建议支持 web socket,目前由 Internet Explorer 10、Google Chrome 和 Mozilla Firefox 实现。Web sockets 非常适合服务器和客户端之间的直接消息通信。

我们所需要的只是一些 JavaScript 来接收服务器数据,以及一个 canvas 来绘制点。以下是 JavaScript 事件处理程序,用于获取数据并将关节绘制到 <canvas> 元素

socket.onmessage = function (evt) {
    status.innerHTML = "Kinect data received.";

    // Get the data in JSON format.
    var jsonObject = eval('(' + evt.data + ')');

    context.clearRect(0, 0, canvas.width, canvas.height);
    context.fillStyle = "#FF0000";
    context.beginPath();

    // Display the skeleton joints.
    for (var i = 0; i < jsonObject.skeletons.length; i++) {
        for (var j = 0; j < jsonObject.skeletons[ i ].joints.length; j++) {
            var joint = jsonObject.skeletons[ i ].joints[ j ];

            // Draw!!!
            context.arc(parseFloat(joint.x), parseFloat(joint.y), 
			10, 0, Math.PI * 2, true);
        }
    }

    context.closePath();
    context.fill();
};

步骤 3:混合起来!

现在运行服务器应用程序,然后在 Internet Explorer 10 或 Google Chrome 中打开 HTML 文件。站在 Kinect 传感器前,愿原力与你同在。

常见问题解答

  • 我真的需要服务器应用程序吗? 是的。您无法直接从浏览器运行 Kinect SDK。JavaScript 无法访问您的硬件。服务器应用程序只是一个 Visual Studio 控制台项目!
  • 我需要将我的数据打包成 JSON 吗? 不。您可以使用任何您喜欢的格式。JSON 是一种用于传输数据的常用格式,尤其是在文件大小很重要时。您可以使用 XML 或任何其他自定义格式,但 JSON 是轻量级的,不需要自定义解析器。毕竟,JSON 是 JavaScript 的子集,因此 JavaScript 可以直接处理它。
  • 为什么不使用 WCF 代替 web sockets? 因为它更难。使用 web sockets,可以在服务器事件发生后发送消息。而且它更容易!

下载次数

您肯定需要下载源代码和二进制文件才能开发自己的 HTML5 Kinect 应用程序。尽情享受吧!

© . All rights reserved.