在MFC 下的picture 中显示视频,不能正常释放内存!主要是cvReleaseCapture(&dlg->input_video) 和m_img不能正常释放,第一次播放时没有问题,停止后,再播放就出问题了
[code=C/C++inline static void allocateOnDemand( IplImage **img, CvSize size, int depth, int channels)
{
    if ( *img != NULL ) return;
    *img = cvCreateImage( size, depth, channels );
    if ( *img == NULL )
    {
        MessageBox(NULL,"Error",NULL,MB_OK);
        
    }
}void CofprobeDlg::OnBnClickedVideostart()
{
if(isThreadPause) //判断是否暂停中
{    isThreadPause=false; m_pThread->ResumeThread();//继续播放 }else{
m_online=true;     m_pThread = AfxBeginThread(thrfunc, this, THREAD_PRIORITY_NORMAL, 0, 0 );  //开启播放线程     }}
UINT CofprobeDlg::thrfunc(LPVOID pParam)
{
CofprobeDlg *dlg = (CofprobeDlg*)pParam; CWnd *wnd = dlg->GetDlgItem(IDC_PICTURBOX);
CDC* pDC = wnd->GetDC();
HDC hDC = pDC->GetSafeHdc();
    CRect rect;
wnd->GetClientRect( &rect );
CvvImage cimg;

dlg->input_video = cvCreateCameraCapture(-1);
cvQueryFrame( dlg->input_video );
    dlg->m_img_size.height =
         (int) cvGetCaptureProperty( dlg->input_video, CV_CAP_PROP_FRAME_HEIGHT );
    dlg->m_img_size.width =
        (int) cvGetCaptureProperty(dlg->input_video, CV_CAP_PROP_FRAME_WIDTH ); dlg->m_alloc=1;
    if(!dlg->m_img && dlg->m_alloc)
{
dlg->allocmemory();
dlg->m_alloc=0;
}

while(dlg->m_online)
{
 MSG msg;   //增加一个MSG的变量msg来接收消息     while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //将消息队列里的消息逐个读入msg
 {      if(msg.message==WM_QUIT)  //如果收到终止消息则退出
{     //TODO:放在堆里的变量要在这里手动清理
dlg->releasememory();

dlg->ReleaseDC( pDC );
cvReleaseCapture(&dlg->input_video);

    dlg->  m_online=false;

return 0;      //线程正常返回,会释放局部变量等内存资源 }else
{    DispatchMessage(&msg);//
   break; }
}
dlg->m_img = cvQueryFrame( dlg->input_video );
            cvCopy(dlg->m_img,dlg->m_img1,0);
    cvCvtColor(dlg->m_img1,dlg->m_frame1_1C,CV_BGR2GRAY);
 
CV_SWAP(dlg->m_frame2_1C,dlg->m_frame1_1C,dlg->swap_temp);
if(dlg->m_img1!= NULL)
  {
cimg.CopyOf(dlg->m_img1);
cimg.DrawToHDC( hDC, &rect );

  }else 
  { 
dlg->MessageBox(_T("Error: keine Frame.")); 
 dlg->  m_online=false;

  } Sleep(1);

}
    cvReleaseCapture(&dlg->input_video);// problem?***************
    dlg->ReleaseDC( pDC );
dlg->releasememory();

return 0;

}void CofprobeDlg::allocmemory()
{
allocateOnDemand( &m_img, m_img_size, IPL_DEPTH_8U, 3 );
allocateOnDemand( &m_img1, m_img_size, IPL_DEPTH_8U, 3 );
allocateOnDemand( &m_frame1_1C, m_img_size, IPL_DEPTH_8U, 1 );
allocateOnDemand( &m_frame2_1C, m_img_size, IPL_DEPTH_8U, 1 );}void CofprobeDlg::releasememory()

    
    cvReleaseImage(&m_frame1_1C);
cvReleaseImage(&m_frame2_1C);
cvReleaseImage(&m_img);// problem?***************
cvReleaseImage(&m_img1);}void CofprobeDlg::OnBnClickedPause()
{
if(!isThreadPause)
{ m_pThread->SuspendThread();     //挂起进程,相当于暂停播放 isThreadPause=true; }
}void CofprobeDlg::OnBnClickedStop()
{
if(m_pThread)
{
isThreadPause=false; ::PostThreadMessage(m_pThread->m_nThreadID,WM_QUIT,0,0);

}
}
][/code]

解决方案 »

  1.   

    inline static void allocateOnDemand( IplImage **img, CvSize size, int depth, int channels)
    {
      if ( *img != NULL ) return;
      *img = cvCreateImage( size, depth, channels );
      if ( *img == NULL )
      {
      MessageBox(NULL,"Error",NULL,MB_OK);
        
      }
    }void CofprobeDlg::OnBnClickedVideostart()
    {
    if(isThreadPause) //判断是否暂停中
    {   isThreadPause=false;m_pThread->ResumeThread();//继续播放}else{
    m_online=true;m_pThread = AfxBeginThread(thrfunc, this, THREAD_PRIORITY_NORMAL, 0, 0 ); //开启播放线程}}
    UINT CofprobeDlg::thrfunc(LPVOID pParam)
    {
    CofprobeDlg *dlg = (CofprobeDlg*)pParam;CWnd *wnd = dlg->GetDlgItem(IDC_PICTURBOX);
    CDC* pDC = wnd->GetDC();
    HDC hDC = pDC->GetSafeHdc();
      CRect rect;
    wnd->GetClientRect( &rect );
    CvvImage cimg;dlg->input_video = cvCreateCameraCapture(-1);
    cvQueryFrame( dlg->input_video );
      dlg->m_img_size.height =
      (int) cvGetCaptureProperty( dlg->input_video, CV_CAP_PROP_FRAME_HEIGHT );
      dlg->m_img_size.width =
      (int) cvGetCaptureProperty(dlg->input_video, CV_CAP_PROP_FRAME_WIDTH );dlg->m_alloc=1;
      if(!dlg->m_img && dlg->m_alloc)
    {
    dlg->allocmemory();
    dlg->m_alloc=0;
    }while(dlg->m_online)

    MSG msg; //增加一个MSG的变量msg来接收消息while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //将消息队列里的消息逐个读入msg
    {   if(msg.message==WM_QUIT) //如果收到终止消息则退出
    {   //TODO:放在堆里的变量要在这里手动清理
    dlg->releasememory();dlg->ReleaseDC( pDC );
    cvReleaseCapture(&dlg->input_video);dlg-> m_online=false;return 0; //线程正常返回,会释放局部变量等内存资源}else
    {DispatchMessage(&msg);//
    break;}
    }
    dlg->m_img = cvQueryFrame( dlg->input_video );
      cvCopy(dlg->m_img,dlg->m_img1,0);
    cvCvtColor(dlg->m_img1,dlg->m_frame1_1C,CV_BGR2GRAY);
      
    CV_SWAP(dlg->m_frame2_1C,dlg->m_frame1_1C,dlg->swap_temp);
    if(dlg->m_img1!= NULL)
    {
    cimg.CopyOf(dlg->m_img1);
    cimg.DrawToHDC( hDC, &rect ); }else  
    {  
    dlg->MessageBox(_T("Error: keine Frame."));  
    dlg-> m_online=false;}Sleep(1);}
      cvReleaseCapture(&dlg->input_video);// problem?***************
      dlg->ReleaseDC( pDC );
    dlg->releasememory();return 0;}void CofprobeDlg::allocmemory()
    {
    allocateOnDemand( &m_img, m_img_size, IPL_DEPTH_8U, 3 );
    allocateOnDemand( &m_img1, m_img_size, IPL_DEPTH_8U, 3 );
    allocateOnDemand( &m_frame1_1C, m_img_size, IPL_DEPTH_8U, 1 );
    allocateOnDemand( &m_frame2_1C, m_img_size, IPL_DEPTH_8U, 1 );}void CofprobeDlg::releasememory()
    {  
      
      cvReleaseImage(&m_frame1_1C);
    cvReleaseImage(&m_frame2_1C);
    cvReleaseImage(&m_img);// problem?***************
    cvReleaseImage(&m_img1);}void CofprobeDlg::OnBnClickedPause()
    {
    if(!isThreadPause)
    {m_pThread->SuspendThread(); //挂起进程,相当于暂停播放isThreadPause=true;}
    }void CofprobeDlg::OnBnClickedStop()
    {
    if(m_pThread)
    {
    isThreadPause=false;::PostThreadMessage(m_pThread->m_nThreadID,WM_QUIT,0,0);}
    }等一下!我先把你的代码弄成这样方便看!