【问题标题】:How can I get the Kinect serial number with OpenNI?如何使用 OpenNI 获取 Kinect 序列号?
【发布时间】:2012-02-17 18:34:27
【问题描述】:

如何在 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);
    } 

【问题讨论】:

    标签: c++ kinect openni


    【解决方案1】:

    我认为 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 进行通信) .

    【讨论】:

      【解决方案2】:

      使用OpenNI2,将想要的序列号作为wantedSerialNumber string

      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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        • 2014-04-27
        • 1970-01-01
        • 2014-11-30
        相关资源
        最近更新 更多