在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]
[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]
解决方案 »
- vs2010 sql2008 msjro.tlh(196): error C2146: 语法错误: 缺少“;”
- 请问如何在调用局域网其他机器上的数据库时,输入共享账户密码
- 以下是MainFrm.cpp的源文件,请高手指点,怎么才能像其它程序那样,程序最大化在任务栏的上方,感谢!
- 遍历CTreeCtrl的递归算法优化问题
- 关于客户区坐标的问题
- 如何不区分大小写查找单词!
- 请教如何在2000&xp系统下对一个对硬件端口进行读写?
- URLDownloadToFile()花了我很长的时间,如何提前判断?
- 紧急求救应用程——序打包发布问题!
- UNICODE 问题 -- 转换不成功???
- VC6如何让媒体播放器不要弹出来?
- 【书籍教材推荐】Socket编程
{
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);}
}等一下!我先把你的代码弄成这样方便看!