рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреИрд╕реЗ рдзреБрдВрдзрд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ

рд╢реБрдн рджреЛрдкрд╣рд░ рдореИрдВ рдЖрдкрдХреЛ рдХрд┐рдиреНрдирдЯ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдЦ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЕрдм рдореИрдВ рдПрдХ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдХрд┐рдиреЗрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рднреАрдбрд╝ рдореЗрдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛ "рдлрд╝рд┐рд▓реНрдЯрд░" рдХрд░рдирд╛ рд╣реИред рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ

рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ OpenNI, OpenCV рдФрд░ Visual Studio 2010 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рд╢реБрд░реБрдЖрдд


рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдХрднреА рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдХрд┐рд╕ рдкрдХреНрд╖ рдХреЛ рд▓реЗрдирд╛ рд╣реИред рдХреБрдЫ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рдХреЗ рдмрд╛рдж, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдЙрднрд░реА:
1 - рдореБрдЭреЗ рдирд┐рдпрдорд┐рдд рдХреИрдорд░реЗ рд╕реЗ рдПрдХ рддрд╕реНрд╡реАрд░ рдорд┐рд▓рддреА рд╣реИ;
2 - рдореИрдВ userPixels (рдкрд┐рдХреНрд╕реЗрд▓ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣реИрдВ) рдорд┐рд▓рддрд╛ рд╣реИ;
3 - рдореИрдВ рдЪрд┐рддреНрд░ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ;
4 - рд╡реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдЬрд┐рдиреНрд╣реЗрдВ "рдХрд╕реНрдЯрдо" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗ рдореВрд▓ рдЫрд╡рд┐ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдиреБрдорд╛рдирд┐рдд рдпреЛрдЬрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!

рдЖрд╡рд╢реНрдпрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред
xn::Context context; xn::ImageGenerator imageGenerator; //         xn::ImageMetaData imageMD; xn::DepthGenerator depthGenerator; //  xn::DepthMetaData depthMD; xn::UserGenerator userGenerator; //    ,     xn::SceneMetaData userPixels; XnUserID users[15]; XnUInt16 nUsers = 15; const XnLabel *pLabels; // ,  !=0    const XnRGB24Pixel *pImageRow; //   XnStatus rc; unsigned int pTexMapX;// = 0; unsigned int pTexMapY;// = 0; XnMapOutputMode outputMode; //     XnPixelFormat pixelFormat; bool mirrored; //    ,     bool blurOn; int currentUserId; struct MyPixel { int posX; int posY; unsigned char *vBlue; unsigned char *vGreen; unsigned char *vRed; int uLabel; bool border; }; MyPixel pixels[640][480]; //   ,   IplImages IplImage *frame; IplImage *frameBlured; 

рджрд░рдЕрд╕рд▓ рдЕрдм рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ:

 int main(){ outputMode.nFPS = 10; outputMode.nXRes = 640; outputMode.nYRes = 480; XnStatus rc; pTexMap = NULL; pTexMapX = 0; pTexMapY = 0; rc = context.Init(); checkStatus(rc, " create context"); //   rc == XN_STATUS_OK   ,     rc = depthGenerator.Create(context); checkStatus(rc, " depth create"); rc = imageGenerator.Create(context); checkStatus(rc, " image create"); rc = userGenerator.Create(context); checkStatus(rc," user create"); return 0; } 


рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреИрдорд░реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЬрдЧрд╣ рдкрд░ рдирд╣реАрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рддрд╕реНрд╡реАрд░ рдЕрд▓рдЧ рд╣реЛрдЧреАред рдПрдХ рджреГрд╢реНрдп рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реЗрдЯ рд╡реНрдпреВрдкреНрд╡рд╛рдЗрдВрдЯ рд╡рд┐рдзрд┐ рд╣реИред рд╣рдо StartGeneratingAll () рдХрдорд╛рдВрдб рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХреИрдорд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯрдореЛрдб рдПрдХ рд╕рдорд╛рди рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

 int main (){ ..... imageGenerator.SetMapOutputMode(outputMode); depthGenerator.SetMapOutputMode(outputMode); imageGenerator.SetPixelFormat(XN_PIXEL_FORMAT_RGB24); //    RGB  context.StartGeneratingAll(); rc = depthGenerator.GetAlternativeViewPointCap().SetViewPoint(imageGenerator); checkStatus(rc, " user and image view"); //      XnCallbackHandle h1; userGenerator.RegisterUserCallbacks(gotUser,lostUser,NULL, h1); //     . currentUserId = -1; //  id          mirrored = false; blurOn = false; frame = cvCreateImage(cvSize(640,480),8,3); frameBlured = cvCreateImage(cvSize(640,480),8,3); //  cvNamedWindow ("Filter demo", CV_WINDOW_AUTOSIZE); //     . showVideo(); return 0; } 

рдлреНрд░реЗрдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдореБрдЦреНрдп рд▓реВрдк рдХреЗ рд╕рд╛рде showVideo () рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдХреИрдорд░реЗ рд╕реЗ рдЫрд╡рд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ XnRGB24Pixel рд╕реЗ IplImage рдЦреАрдВрдЪрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣реИрдВред

 void fromXnRGBToIplImage(const XnRGB24Pixel* pImageMap, IplImage** iplRGBImage) { userGenerator.GetUsers(aUsers,nUsers); userGenerator.GetUserPixels(aUsers[0],userPixels); pLabels = userPixels.Data(); for(int l_y=0;l_y<XN_VGA_Y_RES;++l_y) //XN_VGA_Y_RES = 480 { for(int l_x=0;l_x<XN_VGA_X_RES;++l_x, ++pLabels) //XN_VGA_X_RES= 640 { pixels[l_x][l_y].uLabel = 0; if(pixels[l_x][l_y].border != true) pixels[l_x][l_y].border = false; if(*pLabels !=0) //     { currentUserId = (currentUserId == -1)?(*pLabels):currentUserId; //    ,    pixels[l_x][l_y].uLabel = *pLabels; //      (      ) if((l_x >0) && pixels[l_x-1][l_y].uLabel == 0 || (l_x < XN_VGA_X_RES-1) && pixels[l_x+1][l_y].uLabel == 0 || (l_y >0 ) && pixels[l_x][l_y-1].uLabel == 0 || (l_y < XN_VGA_Y_RES-1) && pixels[l_x][l_y+1].uLabel == 0 ) { pixels[l_x][l_y].border = true; } } //     IplImage    -  OpenNI Group ((unsigned char*)(*iplRGBImage)->imageData)[(l_y*XN_VGA_X_RES +l_x)*3+0] = pImageMap[l_y*XN_VGA_X_RES+l_x].nBlue; ((unsigned char*)(*iplRGBImage)->imageData)[(l_y*XN_VGA_X_RES +l_x)*3+1] = pImageMap[l_y*XN_VGA_X_RES+l_x].nGreen; ((unsigned char*)(*iplRGBImage)->imageData)[(l_y*XN_VGA_X_RES +l_x)*3+2] = pImageMap[l_y*XN_VGA_X_RES+l_x].nRed; } } //    ,     if(blurOn){ cvSmooth(*iplRGBImage,frameBlured,CV_BLUR,14,14,0,0); for(int j = 0 ; j < 480; ++j) { for(int i = 0 ; i < 640; ++i) { if( pixels[i][j].border == true && pixels[i][j].uLabel == currentUserId || pixels[i][j].uLabel == currentUserId ){ ((unsigned char*)(*iplRGBImage)->imageData)[(j*XN_VGA_X_RES +i)*3+0] = frameBlured->imageData[(j*XN_VGA_X_RES +i)*3+0]; ((unsigned char*)(*iplRGBImage)->imageData)[(j*XN_VGA_X_RES +i)*3+1] = frameBlured->imageData[(j*XN_VGA_X_RES +i)*3+1]; ((unsigned char*)(*iplRGBImage)->imageData)[(j*XN_VGA_X_RES +i)*3+2] = frameBlured->imageData[(j*XN_VGA_X_RES +i)*3+2]; } pixels[i][j].border = false; pixels[i][j].uLabel = 0; } } } } 

рдпрд╣ рдХреЙрд▓рдмреИрдХ рдФрд░ рд╢реЛрд╡реАрдбрд┐рдпреЛ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:
 void XN_CALLBACK_TYPE gotUser(xn::UserGenerator& generator, XnUserID nId, void* pCookie) { //  -  } void XN_CALLBACK_TYPE lostUser(xn::UserGenerator& generator, XnUserID nId, void* pCookie) { if((int)nId == currentUserId) { currentUserId = -1; // } } void showVideo() { while(1) { rc = context.WaitOneUpdateAll(imageGenerator); imageGenerator.GetMetaData(imageMD); pImageRow = imageGenerator.GetRGB24ImageMap(); char c = cvWaitKey(33); if(c == 27) // esc   break; if(c == 109) { mirrored = (mirrored == true)?false:true; } if(c == 98) // b { blurOn = (blurOn == true)?false:true; } fromXnRGBToIplImage(pImageRow,&frame); // ,  Context   SetGlobalMirror(bool),             cvFlip if(mirrored) cvFlip(frame, NULL, 1); cvShowImage("Filter demo", frame); } cvReleaseImage( &frame ); cvDestroyWindow("Filter demo" ); } 

рдкрд░рд┐рдгрд╛рдо


рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдврд╝рд╛рдП рдЧрдП рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдореЗрд░реЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдзрдиреНрдпрд╡рд╛рдж, рд╕рдлрд▓рддрд╛!

Source: https://habr.com/ru/post/In127802/


All Articles