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;
}
有人能告诉我如何解决这个问题?
谢谢