void nextDepthFrame () { NUI_IMAGE_FRAME depthFrame; WinRet ret = sensor->NuiImageStreamGetNextFrame(depthStreamHandle, 0, &depthFrame); if (FAILED(ret)) return; BOOL nearModeOperational = false; INuiFrameTexture* texture = 0; ret = sensor->NuiImageFrameGetDepthImagePixelFrameTexture(depthStreamHandle, &depthFrame, &nearModeOperational, &texture); if (FAILED(ret)) return; NUI_LOCKED_RECT lockedRect; texture->LockRect(0, &lockedRect, NULL, 0); if (0 != lockedRect.Pitch) { NUI_SURFACE_DESC surfaceDesc; texture->GetLevelDesc(0, &surfaceDesc); const int width = surfaceDesc.Width; const int height = surfaceDesc.Height; NUI_DEPTH_IMAGE_PIXEL* extended_buf = reinterpret_cast<NUI_DEPTH_IMAGE_PIXEL*>(lockedRect.pBits); ntk_assert(width == that->m_current_image.rawDepth16bits().cols, "Bad width"); ntk_assert(height == that->m_current_image.rawDepth16bits().rows, "Bad height"); if (that->m_align_depth_to_color) { QWriteLocker locker(&that->m_lock); uint16_t* depth_buf = that->m_current_image.rawDepth16bitsRef().ptr<uint16_t>(); mapDepthFrameToRgbFrame(extended_buf, depth_buf); } else { QWriteLocker locker(&that->m_lock); uint16_t* depth_buf = that->m_current_image.rawDepth16bitsRef().ptr<uint16_t>(); cv::Vec2w* depth_to_color_coords = that->m_current_image.depthToRgbCoordsRef().ptr<cv::Vec2w>(); extractDepthAndColorCoords (extended_buf, depth_buf, depth_to_color_coords); } } else { debug(L"Buffer length of received texture is bogus\r\n"); } texture->UnlockRect(0); sensor->NuiImageStreamReleaseFrame(depthStreamHandle, &depthFrame); dirtyDepth = false; }
void storeNuiImage(void) { NUI_IMAGE_FRAME imageFrame; if(WAIT_OBJECT_0 != WaitForSingleObject(hNextColorFrameEvent, 0)) return; HRESULT hr = pNuiSensor->NuiImageStreamGetNextFrame( pVideoStreamHandle, 0, &imageFrame ); if( FAILED( hr ) ){ return; } if(imageFrame.eImageType != NUI_IMAGE_TYPE_COLOR) STDERR("Image type is not match with the color\r\n"); INuiFrameTexture *pTexture = imageFrame.pFrameTexture; NUI_LOCKED_RECT LockedRect; pTexture->LockRect( 0, &LockedRect, NULL, 0 ); if( LockedRect.Pitch != 0 ){ byte * pBuffer = (byte *)LockedRect.pBits; #if defined(USE_FACETRACKER) setColorImage(LockedRect.pBits, LockedRect.size); #endif NUI_SURFACE_DESC pDesc; pTexture->GetLevelDesc(0, &pDesc); //printf("w: %d, h: %d, byte/pixel: %d\r\n", pDesc.Width, pDesc.Height, LockedRect.Pitch/pDesc.Width); typedef struct t_RGBA{ byte r; byte g; byte b; byte a; }; t_RGBA *p = (t_RGBA *)pBuffer; for(int i=0;i<pTexture->BufferLen()/4;i++){ byte b = p->b; p->b = p->r; p->r = b; p->a = (byte)255; p++; } glBindTexture(GL_TEXTURE_2D, bg_texture[IMAGE_TEXTURE]); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pDesc.Width, pDesc.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pBuffer); pTexture->UnlockRect(0); }else{ STDERR("Buffer length of received texture is bogus\r\n"); } pNuiSensor->NuiImageStreamReleaseFrame( pVideoStreamHandle, &imageFrame ); }
void storeNuiDepth(bool waitflag) { NUI_IMAGE_FRAME depthFrame; if(waitflag) WaitForSingleObject(hNextDepthFrameEvent, INFINITE); else if(WAIT_OBJECT_0 != WaitForSingleObject(hNextDepthFrameEvent, 0)) return; HRESULT hr = pNuiSensor->NuiImageStreamGetNextFrame( pDepthStreamHandle, 0, &depthFrame ); if( FAILED( hr ) ){ return; } if(depthFrame.eImageType != NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX) STDERR("Depth type is not match with the depth and players\r\n"); INuiFrameTexture *pTexture = depthFrame.pFrameTexture; NUI_LOCKED_RECT LockedRect; pTexture->LockRect( 0, &LockedRect, NULL, 0 ); D3DLOCKED_RECT LPdest; DepthTex->LockRect(0,&LPdest,NULL, 0); if( LockedRect.Pitch != 0 ){ unsigned short *pBuffer = (unsigned short *)LockedRect.pBits; unsigned char *pDestImage=(unsigned char*)LPdest.pBits; NUI_SURFACE_DESC pDesc; pTexture->GetLevelDesc(0, &pDesc); unsigned short *p = (unsigned short *)pBuffer; for(int y=0;y<60;y++){ for(int x=0;x<80;x++){ unsigned char depth = (unsigned char)((*pBuffer & 0xff00)>>8); unsigned short playerID = NuiDepthPixelToPlayerIndex(*pBuffer); *pDestImage = (unsigned char)(Colors[playerID][0] * depth); pDestImage++; *pDestImage = (unsigned char)(Colors[playerID][1] * depth); pDestImage++; *pDestImage = (unsigned char)(Colors[playerID][2] * depth); pDestImage++; *pDestImage = 255; pDestImage++; pBuffer++; } pDestImage += (128-80)*4; } DepthTex->UnlockRect(0); pTexture->UnlockRect(0); }
void storeNuiDepth(void) { NUI_IMAGE_FRAME depthFrame; if(WAIT_OBJECT_0 != WaitForSingleObject(hNextDepthFrameEvent, 0)) return; HRESULT hr = pNuiSensor->NuiImageStreamGetNextFrame( pDepthStreamHandle, 0, &depthFrame ); if( FAILED( hr ) ){ return; } if(depthFrame.eImageType != NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX) STDERR("Depth type is not match with the depth and players\r\n"); INuiFrameTexture *pTexture = depthFrame.pFrameTexture; NUI_LOCKED_RECT LockedRect; pTexture->LockRect( 0, &LockedRect, NULL, 0 ); if( LockedRect.Pitch != 0 ){ unsigned short *pBuffer = (unsigned short *)LockedRect.pBits; memcpy(depth, LockedRect.pBits, pTexture->BufferLen()); #if defined(USE_FACETRACKER) setDepthImage(LockedRect.pBits, LockedRect.size); #endif NUI_SURFACE_DESC pDesc; pTexture->GetLevelDesc(0, &pDesc); //printf("w: %d, h: %d, byte/pixel: %d\r\n", pDesc.Width, pDesc.Height, LockedRect.Pitch/pDesc.Width); unsigned short *p = (unsigned short *)pBuffer; for(int i=0;i<pTexture->BufferLen()/2;i++){ //*p = (unsigned short)((*p & 0xff00)>>8) | ((*p & 0x00ff)<<8); // for test //*p = (unsigned short)((*p & 0xfff8)>>3); *p = (unsigned short)(NuiDepthPixelToDepth(*pBuffer)); p++; } glBindTexture(GL_TEXTURE_2D, bg_texture[DEPTH_TEXTURE]); glPixelStorei(GL_UNPACK_ALIGNMENT, 2); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, pDesc.Width, pDesc.Height, 0, GL_LUMINANCE, GL_UNSIGNED_SHORT, pBuffer); pTexture->UnlockRect(0); } else{ STDERR("Buffer length of received texture is bogus\r\n"); } pNuiSensor->NuiImageStreamReleaseFrame( pDepthStreamHandle, &depthFrame ); }
void nextColorFrame () { NUI_IMAGE_FRAME colorFrame; WinRet ret = sensor->NuiImageStreamGetNextFrame(colorStreamHandle, 0, &colorFrame); if (FAILED(ret)) return; INuiFrameTexture* texture = colorFrame.pFrameTexture; NUI_LOCKED_RECT lockedRect; texture->LockRect(0, &lockedRect, NULL, 0); if (lockedRect.Pitch != 0) { NUI_SURFACE_DESC surfaceDesc; texture->GetLevelDesc(0, &surfaceDesc); const int width = surfaceDesc.Width; const int height = surfaceDesc.Height; ntk_assert( width == that->m_current_image.rawRgb().cols, "Bad width"); ntk_assert(height == that->m_current_image.rawRgb().rows, "Bad height"); uint8_t* buf = static_cast<uint8_t*>(lockedRect.pBits); // size_t size = size_t(lockedRect.size); { QWriteLocker locker(&that->m_lock); cvtColor(cv::Mat4b(height, width, (cv::Vec4b*)buf), that->m_current_image.rawRgbRef(), CV_RGBA2RGB); } // std::copy(buf, buf + 3 * width * height, (uint8_t*) that->m_current_image.rawRgbRef().ptr()); // cvtColor(that->m_current_image.rawRgb(), that->m_current_image.rawRgbRef(), CV_RGB2BGR); // m_pDrawColor->Draw( static_cast<BYTE *>(LockedRect.pBits), LockedRect.size ); } else { debug(L"Buffer length of received texture is bogus\r\n"); } texture->UnlockRect(0); sensor->NuiImageStreamReleaseFrame(colorStreamHandle, &colorFrame); dirtyColor = false; }