【问题标题】:Languages to develop applications for Xbox 360 kinect为 Xbox 360 kinect 开发应用程序的语言
【发布时间】:2021-04-23 00:12:57
【问题描述】:

我知道这听起来很愚蠢,而且我可能很晚才参加聚会,但这是我想为 Xbox 360 Kinect 编写一个手势识别应用程序(例如 Hand detectionactual finger detection)的东西. SDK(1.8 版)已找到、安装并运行,初步研究已完成 - 我只是忘记查看使用哪种语言编写代码。从 SDK 到文档的链接将是第一件事,但不幸的是,这是一条死胡同。
从提供的示例来看,它似乎是 C++ 或 C#,尽管一些旧帖子也声称是 Java。我的问题是:是否有与 SDK 无关的文档以及在 C++/C#/Java 下的这种特定情况下开发存在哪些陷阱? 2011 年的post 几乎没有涵盖开头。

附录:进一步查看时,我被提示进入开发人员工具包中的示例站点 - 可以访问,但所有列出和链接的示例也是死胡同。

附录:作为参考,我使用了这个instruction - 最终证明是徒劳的。

找到一个版本的 NiTE here

【问题讨论】:

  • 这根本不傻...只是完全偏离主题。

标签: kinect kinect-sdk gesture-recognition xbox360


【解决方案1】:

我过去提供过this answer

我个人最常使用带有 OpenNI 的 Xbox360 传感器(因为它是跨平台的)。此外,OpenNI 旁边的 NITE 中间件提供了一些基本的手部检测甚至手势检测(滑动、圆形手势、“按钮”推送等)。

虽然 OpenNI 是开源的,但 NITE 并非如此,因此您将受限于它们提供的内容。

您共享的链接使用 OpenCV。您可以安装 OpenNI 并从支持 OpenNI 的源代码编译 OpenCV。或者,您可以手动将 OpenNI 帧数据包装到 OpenCV cv::Mat 中,然后从那里继续执行 OpenCV 操作。

这是一个使用 OpenNI 获取深度数据并将其传递给 OpenCV 的基本示例:

#include <OpenNI.h>

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/videoio/videoio.hpp"

#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // setup OpenNI
    openni::Status rc = openni::STATUS_OK;
    openni::Device device;
    openni::VideoStream depth, color;
    const char* deviceURI = openni::ANY_DEVICE;
    rc = openni::OpenNI::initialize();

    printf("After initialization:\n%s\n", openni::OpenNI::getExtendedError());
    rc = device.open(deviceURI);
    if (rc != openni::STATUS_OK)
    {
        printf("Device open failed:\n%s\n", openni::OpenNI::getExtendedError());
        openni::OpenNI::shutdown();
        return 1;
    }

    rc = depth.create(device, openni::SENSOR_DEPTH);
    if (rc == openni::STATUS_OK)
    {
        rc = depth.start();
        if (rc != openni::STATUS_OK)
        {
            printf("Couldn't start depth stream:\n%s\n", openni::OpenNI::getExtendedError());
            depth.destroy();
        }
    }
    else
    {
        printf("Couldn't find depth stream:\n%s\n", openni::OpenNI::getExtendedError());
    }

    if (!depth.isValid())
    {
        printf("No valid depth stream. Exiting\n");
        openni::OpenNI::shutdown();
        return 2;
    }

    openni::VideoMode vm = depth.getVideoMode();
    int cols, rows;
    cols = vm.getResolutionX();
    rows = vm.getResolutionY();

    openni::VideoFrameRef frame;
    depth.start();
    // main loop
    for (;;) {
        // read OpenNI frame
        depth.readFrame(&frame);
        // get depth pixel data
        openni::DepthPixel* dData = (openni::DepthPixel*)frame.getData();
        // wrap the data in an OpenCV Mat
        Mat depthMat(rows, cols, CV_16UC1, dData);
        // for visualisation only remap depth values
        Mat depthShow;
        const float scaleFactor = 0.05f;
        depthMat.convertTo(depthShow, CV_8UC1, scaleFactor);
        if(!depthShow.empty())
        {
            imshow("depth", depthShow);
        }
        
        if (waitKey(30) == 27)   break;

    }
    // OpenNI exit cleanup
    depth.stop();
    openni::OpenNI::shutdown();
}

您链接到的教程之一 (https://github.com/royshil/OpenHPE) 使用 libfreenect,这是与旧版 Kinect 交互的另一个很棒的跨平台选项。

FWIW,Xbox One 的 Kinect 具有更好的深度数据,更好地处理阳光直射,并且 SDK 支持自定义手势识别(例如,参见 this tutorial)。

【讨论】:

  • 谢谢。不幸的是,我似乎被 Windows SDK 困住了——PrimeSense 提供了 OpenNi,而 NiTE 被 Apple 收购并停止运营。有一个后继 OpenNI2 不会与一些附加驱动程序交互。但我认为编译 OpenCV 仍然可以工作 - 我可以让它工作吗? Windows SDK 也可以吗?
  • 是的,Apple 购买了 PrimeSense,但您仍然可以download OpenNI。没错,OpenNI 不会与其他驱动程序交互:LED 控制、加速度计、伺服电机控制、音频。我的假设是深度流是最重要的功能,希望不是音频/LED/电机控制。此外,如上所述,您在问题中链接到的 OpenHPE 存储库使用 libfreenect,它提供对 LED/电机/加速度计/音频的访问...
  • @Quamatoc ...话虽如此,是的,应该可以将深度数据从 Windows SDK 复制到 cv::Mat。快速搜索this answer 弹出。它使用较旧的 OpenCV C API(使用 IplImage 而不是 cv::Mat),但是更重要的部分是如何从 Kinect SDK 访问深度数据。您应该能够轻松地将字节包装成cv::Mat(具有正确的尺寸、通道数和数据类型)
  • 再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多