如何使用OpenNI获取Kinect序列号?

3

我如何在OpenNI中获取我的Kinect设备的序列号?我正在使用avin2的SensorKinect驱动程序。

我正在尝试以下方法,但我的变量serial中只得到“0”:

xn::NodeInfoList possibleChains;
context.EnumerateProductionTrees(XN_NODE_TYPE_DEVICE,NULL,possibleChains,NULL);
for(xn::NodeInfoList::Iterator i = possibleChains.Begin(); i !=
possibleChains.End(); ++i)
    {
        xn::NodeInfo node = *i;
        nRetVal = context.CreateProductionTree(node);
        xn::Device device;
        nRetVal = node.GetInstance(device);
        XnChar serial[1024];
        device.GetIdentificationCap().GetSerialNumber(serial, 1024);
    } 
2个回答

4
我认为目前使用OpenNI还不能实现这一点(至少对于Kinect来说,可能是avin2驱动的问题)。
但是,您可以使用xn :: NodeInfo :: GetCreationInfo (link)获得有关Kinect连接到哪个USB总线/端口的信息。
在Linux上,它包含以下内容(用于设备节点类型):
045e/02ae@5/13 (idVendor/idProduct@BusID/DeviceId) 

我无法展示确切的代码,因为我使用OpenNI Java包装器而不是C ++,但这种方法对于我在Mac / Linux / Win上区分Kinect在我的应用程序中有效。
问题是,当您将Kinect连接到另一个USB时(在Linux上,甚至在重新启动之间有时会更改),总线/端口信息会发生变化。
但是,如果您在Linux上,可以使用以下命令(作为root):
# lsusb -v -d 045e:02ae | grep -e "Bus\|iSerial"
# Bus 005 Device 008: ID 045e:02ae Microsoft Corp. Xbox NUI Camera
#   iSerial                 3 A00365A00972107A
# Bus 005 Device 013: ID 045e:02ae Microsoft Corp. Xbox NUI Camera
#   iSerial                 3 A00365A00955107A

获取 Kinect 的实际序列号。

因此,您可以编写一个 bash 脚本,在 OpenNI 应用程序启动之前运行,该脚本将查找总线/端口并将其传递给您的应用程序(然后应用程序可以使用此信息与正确的 Kinect 进行通信)。


1
使用OpenNI2,将所需的串行号作为wantedSerialNumber字符串提供。
openni::Device device = new openni::Device();
openni::Array<openni::DeviceInfo> deviceList;
openni::OpenNI::enumerateDevices(&deviceList);
for (int i = 0; i != deviceList.getSize(); ++i) {
    const openni::DeviceInfo& info = deviceList[i];
    string uri = info.getUri();
    device->open(uri.c_str());
    char serialNumber[1024];
    device->getProperty(ONI_DEVICE_PROPERTY_SERIAL_NUMBER, &serialNumber);
    if (string(serialNumber) != wantedSerialNumber) {
        device->close();
    } else {
        break;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接