none
Problem with MapColorFrameToDepthFrame RRS feed

  • Question

  • Hello,

    I tried to align the depth image with color image using the MapColorFrameToDepthFrame function but there is a problem at this line of code (Unhandled Exception, Access Violation):

    pMapper->MapColorFrameToDepthFrame(
    			NUI_IMAGE_TYPE_COLOR,
    			NUI_IMAGE_RESOLUTION_640x480,
    			NUI_IMAGE_RESOLUTION_640x480,
    			640 * 480, 
    			(NUI_DEPTH_IMAGE_PIXEL*)LockedRect.Pitch,
    			640 * 480, 
    			depthPoints);

    Here is the code of the Nui_GotDepthAlert:

    bool CSkeletalViewerApp::Nui_GotDepthAlert( )
    {
    	NUI_IMAGE_FRAME imageFrame;
        bool processedFrame = true;
    		
        HRESULT hr = m_pNuiSensor->NuiImageStreamGetNextFrame(
            m_pDepthStreamHandle,
            0,
            &imageFrame );
    
        if ( FAILED( hr ) )
        {
            return false;
        }
    	
    	m_depthTimeStamp = imageFrame.liTimeStamp;
    
        INuiFrameTexture * pTexture = imageFrame.pFrameTexture;
        NUI_LOCKED_RECT LockedRect;
        pTexture->LockRect( 0, &LockedRect, NULL, 0 );
        if ( 0 != LockedRect.Pitch )
        {
    		INuiCoordinateMapper* pMapper;
    	    NUI_DEPTH_IMAGE_POINT* depthPoints;
    
    		depthPoints = new NUI_DEPTH_IMAGE_POINT[640 * 480];
    	    m_pNuiSensor->NuiGetCoordinateMapper(&pMapper);
    
    		//NUI_DEPTH_IMAGE_PIXEL* pdepthpixel = (NUI_DEPTH_IMAGE_PIXEL*)LockedRect.Pitch;
    
    		pMapper->MapColorFrameToDepthFrame(
    			NUI_IMAGE_TYPE_COLOR,
    			NUI_IMAGE_RESOLUTION_640x480,
    			NUI_IMAGE_RESOLUTION_640x480,
    			640 * 480, 
    			(NUI_DEPTH_IMAGE_PIXEL*)LockedRect.Pitch,
    			640 * 480, 
    			depthPoints);
    
    		//memcpy(m_depthD16, LockedRect.pBits, LockedRect.size);
    
            DWORD frameWidth, frameHeight;
            
            NuiImageResolutionToSize( imageFrame.eResolution, frameWidth, frameHeight );
            
            // draw the bits to the bitmap
            BYTE * rgbrun = m_depthRGBX;
            const USHORT * pBufferRun = (const USHORT *)LockedRect.pBits;
    
    		depthData = (USHORT *)LockedRect.pBits;
    
    		
    		// end pixel is start + width*height - 1
            const USHORT * pBufferEnd = pBufferRun + (frameWidth * frameHeight);
    
            assert( frameWidth * frameHeight * g_BytesPerPixel <= ARRAYSIZE(m_depthRGBX) );
    		USHORT depth;
    		USHORT* depth1=(USHORT *)LockedRect.pBits;
    		USHORT realDepth;
            while ( pBufferRun < pBufferEnd )//&& pDepth < depthEnd)
            {
    			/**depthValues = pDepth->depth;
    			depthValues++;*/
    
                //USHORT depth     = *pBufferRun;
    			depth     = *pBufferRun;
                USHORT realDepth = NuiDepthPixelToDepth(depth);
                USHORT player    = NuiDepthPixelToPlayerIndex(depth);
    
                // transform 13-bit depth information into an 8-bit intensity appropriate
                // for display (we disregard information in most significant bit)
                BYTE intensity = static_cast<BYTE>(~(realDepth >> 4));
    
                // tint the intensity by dividing by per-player values
                *(rgbrun++) = intensity >> g_IntensityShiftByPlayerB[player];
                *(rgbrun++) = intensity >> g_IntensityShiftByPlayerG[player];
                *(rgbrun++) = intensity >> g_IntensityShiftByPlayerR[player];
    			
                // no alpha information, skip the last byte
                ++rgbrun;
    
                ++pBufferRun;
            }
    		
    		
    
            m_pDrawDepth->Draw( m_depthRGBX, frameWidth * frameHeight * g_BytesPerPixel );
    			
    
    	}
        else
        {
            processedFrame = false;
            OutputDebugString( L"Buffer length of received texture is bogus\r\n" );
        }
    
        pTexture->UnlockRect( 0 );
    
    	if(m_pDepthStreamHandle != NULL)
    		m_pNuiSensor->NuiImageStreamReleaseFrame( m_pDepthStreamHandle, &imageFrame );	
    
    	
    	
    
        return processedFrame;
    	
    }

    Could someone tell me how to fix this problem?

    Thank you

    Thursday, October 9, 2014 8:58 AM

Answers