2012-01-24 89 views
2

如何在OpenNI中獲得我的kinect設備的序列號?我正在使用 avin2的SensorKinect驅動程序。如何使用OpenNI獲得Kinect序列號?

我嘗試以下,但我只在我的變量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); 
    } 

回答

3

我認爲這是不可能的OpenNI還沒有(至少在Kinect的 - 也許avin2驅動程序惹的禍)。

但是,您可以獲取有關USB總線/端口Kinect的連接使用xn::NodeInfo::GetCreationInfolink

在Linux上成信息包含以下(一個設備節點類型):

045e/[email protected]/13 (idVendor/[email protected]/DeviceId) 

我無法向您顯示確切的代碼,因爲我使用OpenNI java wrapper代替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; 
    } 
}