函数的具体介绍可以看OpenNI的api和大神的文章。
http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&SUB_ID=1&PAPER_ID=262
代码如下:
IplImage img;
XnUInt16 nUsers = userGenerator.GetNumberOfUsers();
cout<<"the users number is :"<<nUsers<<endl;
xn::SceneMetaData smd;
if(nUsers > 0)
{
//get Users ID
XnUserID* aUserID = new XnUserID[nUsers];
userGenerator.GetUsers( aUserID,nUsers );
//save the real pixel
uchar* imgPosition = new uchar[img.height * img.width*3];
for(XnUInt16 i = 1;i<=nUsers;i++)
{
userGenerator.GetUserPixels( i,smd );
/*for(XnUInt32 j = 0;j!=smd.DataSize();j++) // DataSize() ----Gets the data size, in bytes
{
//const XnLabel *&xl = smd.Data(); //smd.Data() ----Gets a pointer to the data. const XnLabel*& xn::SceneMetaData::Data ( ) [inline]
const XnLabel xl = smd(i,j); //UserGenerator::operator(x,y),所以可以簡單地把 x、y 的座標直傳進去,就可以取得該點的值了;而如果不想這樣做的話,也可以使用他的 Data() 函式,直接取得 XnLabel 的指標做進一步的處理。
//xl[]
if( xl>5 )
{
}
}*/
imgPosition = (uchar*)( img.imageData );
for(int y=0;y<img.height;y++)
{
for(int x=0;x<img.width;x++)
{
//imgPosition += 3*x + y*img.widthStep;
//if the pixel belongs to the user pixels,change its rgb value
if( smd( x,y )!=0 ){
switch(i)
{
case 0:
imgPosition[3*x+y*img.widthStep] = 255;
imgPosition[3*x+y*img.widthStep+1] = 0;
imgPosition[3*x+y*img.widthStep+2] = 0;
break;
case 1:
imgPosition[3*x+y*img.widthStep] = 0;
imgPosition[3*x+y*img.widthStep+1] = 255;
imgPosition[3*x+y*img.widthStep+2] = 0;
break;
case 2:
imgPosition[3*x+y*img.widthStep] = 0;
imgPosition[3*x+y*img.widthStep+1] = 0;
imgPosition[3*x+y*img.widthStep+2] = 255;
break;
default:
//if usersID > 3,do whaterver you want to do
break;
}
}
}
}
}
delete []imgPosition;
}
效果图:

本文介绍如何使用OpenNI库获取场景中的用户数量及位置信息,并通过改变RGB值来标记用户像素。代码示例展示了如何初始化图像,获取用户ID列表,以及遍历图像像素以标识属于不同用户的像素。

被折叠的 条评论
为什么被折叠?



