我尝试使用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 :(得分:0)
有,
我遇到了类似的问题,经过长时间的努力,终于找到了它的诀窍。
我在你的代码中找到的第一个问题是在MapColorFrameToDepthFrame函数中,第五个参数似乎应该是LockedRect.pBits。
第二个问题是如何定义pTexture,
INuiFrameTexture* pTexture = imageFrame.pFrameTexture;
不起作用。你必须使用
m_pNuiSensor->NuiImageFrameGetDepthImagePixelFrameTexture(m_hDepthStreamHandle, &imageFrame, &bNearMode, &pTexture)
记得检查一下你是否成功完成了这个功能。我深挖了解原因。
第三个问题是,你必须
delete[] depthPoints;
使用后释放到内存中,因为你使用了新的操作符。
完成所有这些后,我的代码终于正常运行了。希望它对你有所帮助。
感谢。