MFC下通过OpenCV打开AVIA文件,有暂停功能

以前写过打开AVI视频文件的程序,不过那时候在获取一帧的时候使用的是while(1)死循环,每次退出都会卡死,而且不能暂停。

使用while(1)源代码:

void CReadVideoDlg::OnFileOpen()
{
 // TODO: Add your control notification handler code here
 // 文件打开对话框
CFileDialog dlg(true,"*.avi",NULL,NULL,"*.avi|*.avi||");
if (dlg.DoModal()==IDOK)
{
strAviFilePath = dlg.GetPathName();
}else
{
return;
}
 
}

void CReadVideoDlg::OnVideoPro()
{
 // TODO: Add your control notification handler code here
 //声明IplImage指针

IplImage* pImage = NULL;
CvCapture* pCapture = NULL;
//打开AVI视频文件
if(strAviFilePath=="") //判断文件路径是否为空
{
MessageBox("请先选择AVI视频文件!");
return;
}else
{
if(!(pCapture = cvCaptureFromFile(strAviFilePath)))
{
MessageBox("打开AVI视频文件失败!");
return;
}
}


//逐帧读取视频
while(pImage = cvQueryFrame( pCapture ))
{
     CDC *pDC1 = GetDlgItem(IDC_PICTUREBOX1)->GetDC();//根据ID获得窗口指针再获取与该窗口关联的上下文指针 
     HDC hdc1= pDC1->GetSafeHdc();                      // 获取设备上下文句柄
     CRect rect1;           // 矩形类
     GetDlgItem(IDC_PICTUREBOX1)->GetClientRect(&rect1); // 获取box1客户区
     CvvImage cimg1;          //
     cimg1.CopyOf(pImage);        
     cimg1.DrawToHDC(hdc1,&rect1);       //输出图像
     ReleaseDC( pDC1 );
     cimg1.Destroy();          //销毁

      if( cvWaitKey(50) >= 0 ) break;

}

cvReleaseCapture(&pCapture);

}

 

 

今天使用的是定时器来播放AVI文件:

void CMyDlg::Onopenfile()     ///打开文件
{
 // TODO: Add your control notification handler code here

    // 文件打开对话框
    CFileDialog dlg(true,"*.avi",NULL,NULL,"*.avi|*.avi||");
    if (dlg.DoModal()==IDOK)
 {
      strAviFilePath = dlg.GetPathName();
 }
 else
 {
      return;
 }

   //打开AVI视频文件
   if(strAviFilePath=="") //判断文件路径是否为空
   {
      MessageBox("请先选择AVI视频文件!");
      return;
   }
   else
   {
     if(!(pCapture = cvCaptureFromFile(strAviFilePath)))
  {
         MessageBox("打开AVI视频文件失败!");
         return;
  }
   }

   isplay=false;

}


void CMyDlg::Onplay()   //播放
{
 // TODO: Add your control notification handler code here
 SetTimer(1,40,NULL);                //每隔一段时间读出一帧视频图像
 isplay=true;
 
}

void CMyDlg::Onstop()   //暂停
{
 // TODO: Add your control notification handler code here
 if(isplay==true)
 {
   KillTimer(1);
 }
 
}


void CMyDlg::OnOK()    //退出
{
 // TODO: Add extra validation here
 if(isplay==true)
 {
   KillTimer(1);
 }
    cvReleaseCapture(&pCapture);
 CDialog::OnOK();
}

void CMyDlg::OnTimer(UINT nIDEvent)    //定时响应函数
{
 // TODO: Add your message handler code here and/or call default
        pImage = cvQueryFrame( pCapture ); //抓取一帧

        //显示到窗口
     CDC *pDC1 = GetDlgItem(IDC_PICTUREBOX1)->GetDC();//根据ID获得窗口指针再获取与该窗口关联的上下文指针 
     HDC hdc1= pDC1->GetSafeHdc();                      // 获取设备上下文句柄
     CRect rect1;           // 矩形类
     GetDlgItem(IDC_PICTUREBOX1)->GetClientRect(&rect1); // 获取box1客户区
     CvvImage cimg1;          //
     cimg1.CopyOf(pImage);        
     cimg1.DrawToHDC(hdc1,&rect1);       //输出图像
     ReleaseDC( pDC1 );
     cimg1.Destroy();          //销毁

     CDialog::OnTimer(nIDEvent);
}

使用定时器播放可以通过设置SetTimer(1,40,NULL);  中的第二个参数来改变播放速率。40单位是微秒
 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人开发者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值