我正在使用cvSetData将rgb框架整合到一个可用于openCV的框架中。
我略微修改了SkeletalViewer以生成rgb流。
void CSkeletalViewerApp::Nui_GotVideoAlert( )
{
const NUI_IMAGE_FRAME * pImageFrame = NULL;
IplImage* kinectColorImage = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U, 4);
HRESULT hr = NuiImageStreamGetNextFrame(
m_pVideoStreamHandle,
0,
&pImageFrame );
if( FAILED( hr ) )
{
return;
}
NuiImageBuffer * pTexture = pImageFrame->pFrameTexture;
KINECT_LOCKED_RECT LockedRect;
pTexture->LockRect( 0, &LockedRect, NULL, 0 );
if( LockedRect.Pitch != 0 )
{
BYTE * pBuffer = (BYTE*) LockedRect.pBits;
m_DrawVideo.DrawFrame( (BYTE*) pBuffer );
cvSetData(kinectColorImage, (BYTE*) pBuffer,kinectColorImage->widthStep);
cvShowImage("Color Image", kinectColorImage);
//cvReleaseImage( &kinectColorImage );
cvWaitKey(10);
}
else
{
OutputDebugString( L"Buffer length of received texture is bogus\r\n" );
}
cvReleaseImage(&kinectColorImage);
NuiImageStreamReleaseFrame( m_pVideoStreamHandle, pImageFrame );
}
最佳答案
刚刚解决了这个问题。
在使用断点和调试进行大量搜索之后,似乎问题出在cvSetData中使用的指针。我最好的猜测是,在调用cvReleaseImage之前,Nui_GotVideoAlert()更新了pBuffer指向的地址。另外,cvSetData似乎从不复制该地址中的字节。
然后发生的是在不再存在的地址上调用cvReleaseImage。
我通过在NuiImpl.cpp顶部声明kinectColorImage,在:: Nui_GotVideoAlert()中调用cvSetData以及仅在Nui_Uninit()方法中调用cvReleaseImage来解决此问题。这样,kinectColorImage将仅更新,而不是在每次Nui_GotVideoAlert()调用时都创建一个新的IplImage。
https://stackoverflow.com/questions/7019625/