2014-10-09 74 views
0

我尝试使用MapColorFrameToDepthFrame功能对准与彩色图像的深度图像,但有在这行代码(未处理的异常,访问冲突)的一个问题:MapColorFrameToDepthFrame(未处理的异常,访问冲突)

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); 

这里是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; 

}

有人能告诉我如何解决这个问题?

谢谢

回答

0

那里,

我有一些类似的问题,努力就可以了很长一段时间后,终于找到了它的窍门。

我在代码中发现的第一个问题是在MapColorFrameToDepthFrame函数中,第五个参数似乎应该是LockedRect.pBits。

第二个问题是如何定义pTexture,

INuiFrameTexture* pTexture = imageFrame.pFrameTexture; 

将无法​​正常工作。你必须使用

m_pNuiSensor->NuiImageFrameGetDepthImagePixelFrameTexture(m_hDepthStreamHandle, &imageFrame, &bNearMode, &pTexture) 

记得检查你是否成功的这个功能。我深入挖掘为什么。

第三个问题是,你必须

delete[] depthPoints; 

使用释放到内存中以便之后,因为你就可以使用新的运营商。

毕竟,我的代码终于工作了。希望它对你有所帮助。

谢谢。

相关问题