函数的具体介绍可以看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;
}
效果图: