MFC下通过OpenCV打开AVIA文件,有暂停功能
2012-08-27 16:25
218 查看
以前写过打开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单位是微秒
使用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单位是微秒
相关文章推荐
- 在MFC中通过opencv显示摄像头视频或者文件视频
- 《MFC实现文件打开和保存功能实现》
- 在MFC中通过opencv显示摄像头视频或者文件视频
- 在MFC中通过opencv显示摄像头视频或者文件视频
- 在MFC中通过opencv显示摄像头视频或者文件视频
- MFC 通过opencv打开摄像头 拍照后显示保存
- opencv cvLoadImage(mPath)通过打开文件读取图片,读不到图片问题
- 通过js只提供另存为功能【避免直接打开后,文件被占用,其他用户更新不了文件信息】(转)
- 在MFC中实现打开文件的功能
- MFC打开文件对话框功能实现
- C#通过打开窗口打开文件,及新建文件的功能(另存为)
- MFC实现文件打开和保存功能实现
- 自己写的简单通过js只提供另存为功能【避免直接打开后,文件被占用,其他用户更新不了文件信息】
- 获取文件大小的六种方法大全,打开文件和不打开文件都有,C方法获取,C++方法获取,MFC方法获取。
- MFC打开文件对话框
- Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能 视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播
- MFC打开或者保存文件
- 使用firefox直接 打开pdf文件可以破解禁止打印的功能
- MFC 中打开 文件,文件夹,以及删除文件,文件夹操作
- vs2010 单文档MFC 通过加载位图文件作为客户区背景