memory - cvShowImage和Kinect SDK的内存问题:骨架查看器

我正在使用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 );

}

使用cvReleaseImage,我会得到一个cvException错误。不完全确定未指定的那个。没有cvReleaseImage,我将使rgb视频在openCV窗口中运行,但最终会崩溃,因为它内存不足。

如何正确释放图像?

最佳答案

刚刚解决了这个问题。

在使用断点和调试进行大量搜索之后,似乎问题出在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/

相关文章:

opencv - 保存IPL_DEPTH_IMAGE供以后处理

c# - EmguCV - 运动检测不返回角度

visual-studio-2010 - 我无法使用 VS2010 运行 openCV2.3.1

android - 使用opencv在android中抓取连续帧

colors - 识别opencv中检测到的圆圈的颜色

opencv - cvSetErrMode 不工作

c# - 如何申请cvsobel + emgucv

opencv - 无法使用 OpenCV 从 FireWire cam 捕获图像

image - 将 GDIPlus::Bitmap 转换为 cv::Mat(OpenCV C++ 接

python-3.x - 队列的等价arg 'durable'