kinect - 为 Xbox 360 kinect 开发应用程序的语言
问题描述
我知道这听起来很愚蠢,而且我可能很晚才参加聚会,但这是我想要为 Xbox 360 Kinect编写手势识别应用程序(例如手部检测或实际手指检测)的事情。SDK(1.8 版)已找到、安装并运行,初步研究已完成 - 我只是忘记查看使用哪种语言编写代码。从 SDK 到文档的链接将是第一件事,但不幸的是,这是一条死胡同。
从提供的示例来看,它似乎是 C++ 或 C#,尽管一些旧帖子也声称是 Java。我的问题是:是否有与 SDK 无关的文档以及在 C++/C#/Java 下的这种特定情况下开发存在哪些陷阱?一个帖子从 2011 年开始几乎没有涵盖。
附录:在进一步查看时,我被提示进入开发人员工具包中的示例站点 - 可以访问,但所有列出和链接的示例也是死胡同。
附录:作为参考,我使用了这个指令——最终证明是徒劳的。
在这里找到了一个 NiTE 版本
解决方案
我过去提供过这个答案。
就我个人而言,我最常使用带有 OpenNI 的 Xbox360 传感器(因为它是跨平台的)。此外,OpenNI 旁边的 NITE 中间件提供了一些基本的手部检测甚至手势检测(滑动、圆形手势、“按钮”推送等)。
虽然 OpenNI 是开源的,但 NITE 并非如此,因此您将受限于它们提供的内容。
您共享的链接使用 OpenCV。您可以安装 OpenNI 并从支持 OpenNI 的源代码编译 OpenCV。或者,您可以手动将 OpenNI 帧数据包装到 OpenCVcv::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 支持自定义手势识别(例如,请参阅本教程)。
推荐阅读
- python-3.x - Python中的Deque附加字典与Deque(字典)
- python - 如何使用带有要更改的变量的列表在 for 循环中更改分类变量
- redux - 如何从嵌套对象 redux 状态中删除项目
- android - Rxjava 一次性使用 Fire and Forget API 调用
- javascript - 如何在数据表中更改从数据库中获取的日期格式
- xml - 我想使用变量中的元素内容作为 XPath 值
- python - 如何使用 Django 更新对象并在特定时间创建一个?
- ssl - 什么是 TLS,我们为什么需要它?
- javascript - 为什么当我单击时出现警告框 javascript 中的未定义问题
- java - 为什么这个寻找素数的程序会输出两个答案?