MapColorFrameToDepthFrame(未处理的异常,访问冲突)

时间:2014-10-09 12:52:16

标签: c++ kinect-sdk

我尝试使用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;

}

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

谢谢

1 个答案:

答案 0 :(得分:0)

有,

我遇到了类似的问题,经过长时间的努力,终于找到了它的诀窍。

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

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

INuiFrameTexture* pTexture = imageFrame.pFrameTexture;

不起作用。你必须使用

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

记得检查一下你是否成功完成了这个功能。我深挖了解原因。

第三个问题是,你必须

delete[] depthPoints;

使用后释放到内存中,因为你使用了新的操作符。

完成所有这些后,我的代码终于正常运行了。希望它对你有所帮助。

感谢。