
实现了在MFC中显示图片,再要显示一个视频就是轻而易举的事了,本篇介绍使用Opencv制作一个简易的播放器,实现打开文件、暂停、继续播放、再次播放和总当前帧数显示功能。
首先还是先看一下界面效果:
嗯,是不是很有MFC的感觉,简洁大方、朴素典雅又实用~~,如果用一个字来概括的话那就是——丑!(按下不表~~)
1. 定义变量
控件之间有一些标志位等变量需要传递,这里用了一个偷懒的方法,在文件内直接定义一个类Vardefine,用来保存和传递变量:
2.打开视频文件
加入一个按钮控件button1,双击控件添加事件处理程序:
里边playVIDeo(CString &str)是播放视频的实现模块。
3. 暂停&继续播放&再次播放
同样加入第二个按钮控件button2,双击添加事件处理程序,涉及每次点击控件都会改变控件的显示文本,你一定玩过这个小把戏
进群:548377875 即可获取大量的学习资料以及从零开始到项目的实战的pdf数十本呢!
4.视频播放模块
这里首先要在OpencvVIDeoDlg.h(你命名的工程可能不叫OpencvVIDeo,替换为你的命名)头文件里声明方法“playVIDeo(CString &str)”,为了显示方便,把整个头文件贴出来如下:
// OpencvVIDeoDlg.h : 头文件
//
#pragma once
#include "afxwin.h"
// copencvVIDeoDlg 对话框
class copencvVIDeoDlg : public CDialogEx
{
// 构造
public:
copencvVIDeoDlg(CWnd* pParent = NulL);// 标准构造函数
// 对话框数据
enum { IDD = IDD_OPENCVVIDEO_DIALOG };
protected:
virtual voID DoDataExchange(cdataExchange* pDX);// DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOol OnInitDialog();
afx_msg voID OnSysCommand(UINT nID,LParaM lParam);
afx_msg voID OnPaint();
afx_msg HCURSOR OnqueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg voID OnBnClickedbutton1();
afx_msg voID OnBnClickedbutton2();
//Cbutton IDC_button2;
afx_msg voID OnBnClickedCancel();
afx_msg voID OnBnClickedOk();
};
加粗标红的那一行就是添加的视频显示函数声明。
playVIDeo函数具体实现代码:
voID copencvVIDeoDlg::playVIDeo(CString &str)
{
//CString to string 使用这个方法记得字符集选用“使用多字节字符”,不然会报错
string vIDeopath=str.GetBuffer(0);
VIDeoCapture vIDeocap(vIDeopath); //打开视频文件
if(!vIDeocap.isOpened()) //检查是否打开
{
MessageBox("视频文件打开失败,请检查!");
return;
}
double totalFrameNumber = vIDeocap.get(CV_CAP_PROP_FRAME_COUNT); //获取视频帧率
CString ctotalFrameNumber;
ctotalFrameNumber.Format("%f",totalFrameNumber); //double->CString
SetDlgitemText(IDC_EDIT1,ctotalFrameNumber); //在edit1控件里显示总帧数
double vIDeorate=vIDeocap.get(CV_CAP_PROP_FPS); //获取帧率
double vIDeodelay=1000/vIDeorate; //计算视频每一帧间隔
Mat image;
Mat vIDeoimage;
//以下 *** 作获取图形控件尺寸并以此改变图片尺寸
CRect rect;
GetDlgitem(IDC_STATIC_VIDeo)->GetClIEntRect(&rect);
Rect dst(rect.left,rect.top,rect.right,rect.bottom);
while(true)
{
vIDeocap.read(image); //视频一帧一帧读入Mat
resize(image,vIDeoimage,cv::Size(rect.WIDth(),rect.Height())); //调整以适应窗口
imshow("vIEw",vIDeoimage);
while(Vardefine::pause) //判断是否要求暂停
{
if(Vardefine::playOn) //若要求继续播放,则跳出
{
break;
}
waitKey(50);
}
waitKey(vIDeodelay); //每帧之间时间间隔
Vardefine::frameNum+=1;
CString cFrameNum;
cFrameNum.Format("%f",Vardefine::frameNum-1);
SetDlgitemText(IDC_EDIT2,cFrameNum); //在edit2内显示当前帧数
if(Vardefine::frameNum>totalFrameNumber) //若播放视频完成,则跳出
{
break;
}
}
SetDlgitemText(IDC_button2,"再次播放"); //置按钮控件为“再次播放”
vIDeocap.release(); //释放视频
}
视频总帧数以及当前帧显示已经包含在播放方法内实现了,不再赘述。
最后显示一下播放效果:
通过对话框选择视频文件后界面:
点击暂停之后界面:
点击继续播放后界面:
播放完成:
再次播放:
总结以上是内存溢出为你收集整理的基于OpenCV从零开始的视频播放器!聘美腾讯,优酷等软件的神器!全部内容,希望文章能够帮你解决基于OpenCV从零开始的视频播放器!聘美腾讯,优酷等软件的神器!所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)