3--怎样从视频影像文件中提取帧(参考模板)
发布时间:2021-03-11
如不慎侵犯了你的权益,请联系告知!怎样从视频影像文件中提取指定的帧武汉工业学院 计算机与信息工程系 管庶安
在视频图像识别中,首先要解决的问题是从视频文件(如MPEG1~4、AVI等)中提取任一时刻的一帧图像,简称为帧。以便分析该帧中感兴趣的目标。Microsoft 的DirectShow提供了这一功能。
1 DirectShow概述
DirectShow属于DirectX家族中的组件之一(DirectX还包括Direct3D、DirectInput、DirectDraw、DirectSound等组件)。在使用DirectShow前,必须安装DirectX SDK开发包。这里推荐安装的版本是DirectX8.0 SDK,可以从微软的网站上下载得到。安装前,你的计算机上应已安装了VC++6.0。
安装后,将在C盘的根目录下生成一个mssdk目录,该目录下有lib子目录(含DirectX的函数库)、include子目录(含头文件)、samples子目录(各种源程序例子)、doc子目录(使用说明文挡)等。同时,还会自动在VC++系统中设置好DirectX SDK的Include路径和Lib路径,你可以启动VC查看。方法是选择菜单“Tools/Options…”,在弹出的Options对话框中选择Directories选项卡,看看Include files和Library files中是否包含有DirectX SDK的Include路径和Lib路径。
由于DirectX SDK是用COM的方式发布的,所以还 应对COM的基本原理有所了解。关于此,你可以从下面 的实现步骤中领悟。
2 实现步骤
2.1 建立MFC AppWizard[exe]工程。
以下假设工程名为Mpg。在第1步选Single document (单文档,第2~5步选默认设置,第6 步的Base Class栏 选CformView,完成工程的设置。上述操作中,未提及的 选项一律取默认值。于是,MFC为我们建立了如右图所示 的文件。
2.2 创建IMediaDet接口实例
为了实现用DirectShow抓帧,要使用DirectShow的IMediaDet接口。因此工程中需要包含dshow.h、qedit.h、atlbase.h文件及其库文件。请按如下方式操作:
(1)在MpgView.h文件的class CGrabView : public CformView前添加(粗体字为自己添加,以下同):
……
#include "dshow.h" #include "qedit.h" #include "atlbase.h"
class CGrabView : public CFormView {……
(2)选Project/Setings菜单,在弹出的Project Setings对话框中选Link卡,在1 / 7
如不慎侵犯了你的权益,请联系告知!
Object/library modules栏填写
2 / 7
如不慎侵犯了你的权益,请联系告知!
Strmiids.lib,点击OK按钮。
(3)定义在程序中要用到的DirectShow COM接口实例MediaDet。
先在MpgView.cpp文件中定义MediaDet接口实例。然后,在CMpgView类的构造函数CMpgView:::CMpgView( 中对此接口进行初始化和创建。
……
IMediaDet *pDet=NULL; // 定义IMediaDet接口实例,并赋以空指针值 CMpgView::CMpgView(
: CFormView(CMpgView::IDD {……
// TODO: add construction code here CoInitialize(NULL; HRESULT hr;
hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void** &pDet ;
if (FAILED(hr { } ……
//创建失败
MessageBox("创建IMediaDet接口实例失败!","错误",MB_ICONSTOP|MB_OK;
//初始化COM接口
2.3 从视频文件中得到视频流信息
本步骤要作的工作是:
● 将待抓帧的影片文件与接口实例关联起来,使得以后调用接口函数操作,就是针对与之关联的影片文件进行的。
● 从之关联的影片文件中的视频流中提取抓帧所需要的信息,如帧图像的高宽、帧速率、影片流的持续时间、帧间隔时间等。
上述工作相对独立,可以设计一个函数来完成。将此函数命名为LoadMovie( ,并且还需要定义存储上述参数的变量。为此,
(1)在MpgView.h文件中添加如下定义:
class CMpgView : public CFormView {