AVI文件结构和操作文档格式.docx
- 文档编号:18938673
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:18
- 大小:306.63KB
AVI文件结构和操作文档格式.docx
《AVI文件结构和操作文档格式.docx》由会员分享,可在线阅读,更多相关《AVI文件结构和操作文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
(2)数据块,一个ID为"
movi"
的LIST块,包含AVI的音视频序列数据。
(3)索引块,ID为"
idxl"
的子块,定义"
LIST块的索引数据,是可选块。
AVI文件的结构如下图所示,下面将具体介绍AVI文件的各子块构造。
二.AVI与BMP的关系
一个AVI文件是由多个BMP文件构成。
如下图:
AVI视频序列中的“帧”即为位图。
AVI视频序列中的“帧”的数量和位图数量是对应的。
三.分析analysis目录里AVI操作函数的写法
目录“Easy_BMP2AVI”
在此目录下运行如下:
图1
上图的一些命令是用来合成avi的,在一下函数的调用:
cvLoadImage:
从文件中读取图像。
cvCreateVideoWriter:
创建视频文件写入器。
cvWriteFrame:
写入一帧到一个视频文件中。
cvGetCaptureProperty:
获得视频获取结构的属性,如视频序列的帧数等。
cvCaptureFromFile为从文件中读取而打开文件
cvQueryFrame从摄像头或者文件中抓取并返回一帧
可以很方便的把BMP合成AVI。
一下是合成的过程:
图2
最终可以打开结果看一下:
图3
四.OpenCV及MFC实现AVI的合成和分解
1.创建一个MFC对话框应用程序(Dialog-basedApplication),在名称栏输入创建项目的名称,点击“确定”。
2.在出现的“MFC应用程序向导”对话框内,选择“基于对话框”,并取消“使用Unicode库(N)”其他选项不做修改,单击“下一步”如下图:
图4
3.一直点击“下一步”到“生成的类”对话框,选择基类为“CDialog”单击完成即可创建一个MFC对话框。
图5
4.删除“TODO:
在此放置对话框控件。
”、“确定”和“取消”控件。
然后点击“工具”中的“Button”添加以下五个控件并改名。
结果如下下图:
图6
5.接着点击属性栏中的“控制事件“按钮,弹出如下对话框:
图7
选择
分别添加OnBnClickedButton1()•••OnBnClickedButton5()
6.在工具箱中点击
在图中添加后如下图:
图8
7.在工具箱中点击“GroupBox”,从左上角往右下角拖拉到“开始分解”止,同时修改其属性栏里的的“静态”为“AVI的合成”,完成后如图:
图9
同理可得完成下一部分:
图10
8.依次右击“示例编辑框”按钮分别添加变量,如图:
图11
变量名分别为m_1,m_2,m_3,m_4。
9.在“解决方案资源管理器下”打开“BY_MFC_YJCDlg.h”,在“#pragmaone”下面添加:
#include"
cv.h"
highgui.h"
cxcore.h"
#include<
stdio.h>
shlwapi.h"
direct.h>
io.h>
vector>
usingnamespacestd;
#defineUM_PROGRESSWM_USER+1
10.在最后的“}”内添加:
afx_msgLRESULTOnrogress(WPARAM,LPARAM);
public:
char*choisebmppath(HWNDhWnd,CHAR*szTitle,CHAR*szPath);
intbmptoavi();
afx_msgvoidOnBnClickedButton10();
voidGetFile(CStringsPath,vector<
CString>
*filePaths);
CStringgetFileExt(CStringfilePath);
BOOL__cdeclisSameType(char*Ext,constchar*format,...);
11.打开源文件“BY_MFC_YJCDlg.cpp”,在“#ifdef_DEBUG”上添加:
stdlib.h>
在“#endif”下添加:
CStringbmp_path1;
CStringbmp_path;
//bmp路径(hecheng)
CStringAviFileName;
//AVIL路径
CStringAVI_path;
inti=1;
//intbmptoavi(LPVOIDlpParameter);
//shengming
CEditdlg;
12.在“END_MESSAGE-MAP()”的上面和
下面添加:
ON_MESSAGE(UM_PROGRESS,Onrogress)
13.在
char*COPENCV_AVI_BMPDlg:
:
choisebmppath(HWNDhWnd,CHAR*szTitle,CHAR*szPath)//获得文件夹
{
BROWSEINFObi;
LPCITEMIDLISTpItemIDList;
bi.hwndOwner=AfxGetMainWnd()->
GetSafeHwnd();
bi.pidlRoot=NULL;
bi.pszDisplayName=szPath;
bi.lpszTitle=szTitle;
bi.ulFlags=BIF_RETURNONLYFSDIRS;
bi.lpfn=NULL;
bi.iImage=0;
pItemIDList=SHBrowseForFolder(&
bi);
if(NULL==SHGetPathFromIDList(pItemIDList,szPath))
{
AfxMessageBox("
路径为获取"
);
}
return(char*)szPath;
}
14.在OnBnClickedButton2()下添加:
if(0==m_1.GetWindowTextLength())
AfxMessageBox("
pleaseCHOISEbmp_filename!
"
exit
(1);
pleaseINPUTbmp_filename!
//AfxBeginThread((AFX_THREADPROC)bmptoavi,(void*)this);
PostMessage(UM_PROGRESS);
bmptoavi();
intCOPENCV_AVI_BMPDlg:
bmptoavi()
CStringFileName;
CvVideoWriter*writer;
IplImage*frame;
vector<
imgFilePaths;
GetDlgItemText(IDC_EDIT1,bmp_path);
//BMP的文件路径
GetFile(bmp_path,&
imgFilePaths);
for(inti=0;
i<
imgFilePaths.size();
++i)
{
frame=cvLoadImage(imgFilePaths.at(i).GetBuffer());
if(i==0)
{
intAviForamt=-1;
//设置压缩格式
intFPS=25;
intAviColor=1;
writer=cvCreateVideoWriter(AviFileName,-1,FPS,cvGetSize(frame),AviColor);
}
cvWriteFrame(writer,frame);
cvWaitKey
(1);
cvReleaseImage(&
frame);
cvReleaseVideoWriter(&
writer);
return0;
/*
*功能:
获取文件夹下的所有图片文件
*/
voidCOPENCV_AVI_BMPDlg:
GetFile(CStringsPath,vector<
*filePaths)
if(sPath.IsEmpty())
return;
CFileFindff;
CStringszDir=sPath;
CStringExt;
if(szDir.Right
(1)!
="
\\"
)
szDir+="
;
szDir+="
*.*"
BOOLres=ff.FindFile(szDir);
while(res)
res=ff.FindNextFile();
CStringsFileName;
if(ff.IsDirectory()&
&
!
ff.IsDots())//文件夹
CStringsFilePath=ff.GetFilePath();
sFileName=ff.GetFileTitle();
GetFile(sFilePath,filePaths);
elseif(!
ff.IsDirectory()&
ff.IsDots())//文件
CStringstrFilePath=ff.GetFilePath();
Ext=getFileExt(ff.GetFilePath());
if(isSameType(Ext.GetBuffer(),"
ss"
"
bmp"
jpg"
))
{
filePaths->
push_back(strFilePath);
}
ff.Close();
CStringCOPENCV_AVI_BMPDlg:
getFileExt(CStringfilePath)
filePath.ReleaseBuffer();
intpos=filePath.ReverseFind('
.'
if(pos>
=0)
returnfilePath.Right(filePath.GetLength()-pos-1);
BOOL__cdeclCOPENCV_AVI_BMPDlg:
isSameType(char*Ext,constchar*format,...)
{
va_listap;
intbuffing;
intretval;
charch;
char*ext;
va_start(ap,format);
_ASSERTE(format!
=NULL);
ext=strlwr(Ext);
while(ch=*(format++))
switch(ch)
case'
s'
char*p=va_arg(ap,char*);
if(0==strcmp(Ext,p))
{
return1;
}
break;
default:
printf("
inputparameteriserror\n"
return-1;
break;
return(0);
15.在OnBnClickedButton1()下添加:
charpath[MAX_PATH];
choisebmppath(m_hWnd,"
bmp文件夹"
path);
bmp_path=path;
SetDlgItemText(IDC_EDIT1,bmp_path);
AviFileName="
E:
\\avi.avi"
SetDlgItemText(IDC_EDIT2,"
16.在OnBnClickedButton3()下添加:
CFileDialogdlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL,0);
if(!
dlg.DoModal())
创建失败"
AVI_path=dlg.GetPathName();
SetDlgItemText(IDC_EDIT3,AVI_path);
LRESULTCOPENCV_AVI_BMPDlg:
Onrogress(WPARAM,LPARAM)
pgctrl.OffsetPos
(2);
pgctrl.SetStep
(1);
//设置步长
pgctrl.SetRange32(1,1000);
pgctrl.SetPos(i);
pgctrl.SetBkColor(RGB(255,0,0));
pgctrl.StepIt();
//让进度条动起来
return1;
17.在OnBnClickedButton4()下添加:
if(m_3.GetWindowTextLength()==0)
AVI文件出错"
exit
(1);
CvCapture*capture;
capture=cvCaptureFromAVI(AVI_path);
CStringstrtemp;
CStringnewFileName;
inti=1;
UpdateData(FALSE);
for(i=1;
101;
i++)
FileName.Format("
Frame-%03d.bmp"
i);
if(i==1)
GetDlgItemText(IDC_EDIT4,strtemp);
newFileName=strtemp+FileName;
frame=cvQueryFrame(capture);
if(!
cvSaveImage(newFileName,frame))
提取失败"
cvWaitKey
(1);
18.然后修改相应位置的所有“COPENCV-AVI-BMPDlg”为“C(工程名)Dlg”。
并且在“项目属性”的“附加依赖项”添加“cv.libhighgui.libcvaux.libcxcore.lib”运行得:
图12
五.实验心得与总结
本次试验主要是针对AVI的处理,在学长的讲解下,了解AVI的基本概念,并且掌握AVI文件常用的程序读写方法。
知道AVI视频文件的帧的读取方法,以及了解BMP和AVI的基本关系。
但是这些基本关系只是稍微了解了一下,但具体的内容还需要进一步学习。
由于试验目的需要对一些代码的理解,对C++有更深度的认识,现在应该多看一些有关C++的内容。
还需要更深一步的理解Opencv的机制与功能,将Opencv透彻的系统学习,加深对其的理解。
这次试验是时隔一个假期的时间,如果长时间不去动手会有很多困难,所以在今后的学习过程中应该不断的学习,俗话说“活到老,学到老”,我们时时刻刻需要学习,这样才能将知识运用的熟能生巧。
无论休息什么,信心是必要的因素,我们要对自己做的有信心,培养自己的兴趣,让自己更加爱好自己所学习的,并不是遇到挫折就后退,有句话这样说“不经历风雨,怎么能见彩虹”。
我相信我的背后一定是彩虹,继续努力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVI 文件 结构 操作