论文部分内容阅读
摘 要:考生肖像信息的即时采集越来越多地被应用到招生考试工作中。文章介绍了如何在Windows系统上运用Debhi 7和DSPack快速开发基于Direct Show技术的数码摄像程序。
关键词:数码摄像;DSPack;DirectX;Direct Show
0 引言
在招生信息采集工作中,一个非常重要的部分就是采集考生的肖像信息。随着考生人数的激增与工作要求的提高,肖像采集模式的不断调整,从最早的扫描仪扫描照片、数码相机联机拍摄一直到现在的视频捕获卡+摄像机快速采集,以不断适应招生形势的变化。我们把联机直接拍摄考生肖像的程序叫数码摄像程序。对于数码摄像程序,早期大多利用Video forWindow编写,它支持的设备种类少,且实现难度较高。现在利用Direct Show可以开发出支持摄像头、内置或外置视频采集卡、1394卡、内置或外置电视卡等多种设备的数码摄像程序,但直接用Direct Show开发,难度同样很高且开发效率也不高。可是有了DSPack情况就完全不同了,利用它来开发一个数码摄像程序,几乎是一件轻而易举的事情。
DSPack是一组封装了MS Direct Show和DirectX技术的组件,用于在安装了DirectX9的Windows 9x、ME、2000和Windows XP系统上的多媒体应用系统的开发。它支持Delphi5、6、7和C++ Builder 6,它不仅功能强大而且完全免费。本文对利用DSPack开发视频捕获方式的数码摄像程序做一个粗浅的介绍。
1 DSPack的安装
DSPack的下载地址为: http://www.progdigy.com/modules.php?name=DSPack,当前版本是2.3.4。为了避免不必要的麻烦,先要确认系统中已装上了DirectX9,然后再安装DSPack。如果想进行VMR、Direct3D或ASF方面的开发,则还需要下载并安装一些别的内容(请参考所下载的DSPack234.zip中所含Readme.htm中文件的相关内容)。下面是DSPack的安装步骤:
(1)将DSPack解压至任意目录。假设解压至Programfiles\DSPack目录,然后查看,有没有只读属性的文件,如果有,请把只读属性去掉;
(2)以Delphi 7为例,在Tools>Environment Options>Li-brary>Library path中,添加以下搜索路径:
Program files\DSPack\src\Directx9
Program files\DSPack\src\DSPack
(3)用Files>open分别打开Program files\packages下的DirectX9_D7.dpk和DSPack_D7.dpk按Compile钮进行编译;
(4)最后打开Program files\packages下的DSPackDesign_D7.dpk,按Install钮进行安装。
以上步骤如果顺利完成,并且在Delphi工具栏上出现了如图1所示的DSPack工具栏,则安装成功。
2 一个最基本的摄像程序功能概述
它由预览窗口、取景框、照片名输入框、拍摄钮、照片和设备连接与设置这六个部分组成。其使用步骤与方法为:首先,在程序运行时所显示的视频设备下拉列表中,选中其中一个(如果有多个的话),按连接按钮,程序就会连接指定的视频设备,如果连接正常就会在预览窗口中即时显示被拍摄对像;然后输入照片名,自由拖动取景框,框住要拍摄的部分(通常是头像),按拍摄按钮就可以把取景框中的内容拍摄下来显示在照片上,并同时保存为“照片名.jpg”。
图2所示,这是通过一个Logitech QuickCam Pro 4000摄像头拍摄某游戏杂志的封面女主角所看到的程序运行效果截图。
3 关键点说明
(1)所用到的DSPack组件
FilterGraph、Filter、SampleGrabber和VideoWindow各一个,将Filter、SampleGrabber和VideoWindow的FilterGraph属性都设置成FilterGraph的name,并注意将FilterGraph的Mode属性设置成gmCapture。
DSPack及普通VCL的组件分布如图3所示。
(2)视频设备的联接因为是要用来拍摄照片,所以我们要求只列出支持DireShow的视频设备就可以了,否则在设备列表中将出现一大堆与应用无关的设备。方法是声明一个TsysDevEnum型变量sysdev,在表单的OnCreate中,利用TSysDevEnum.Create(CLSID_VideolnputDeviceCategory)把视频设备列表取到sysdev中。
(3)取景框的制作
如果用Video for Window方式开发过视频捕获程序,就会知道要在一个视频流上放一个框不是一件容易的事——任何控件往上一放,只要一连接视频,它就会消失。传统的办法是放一个Timer,在OnTimer事件中不停地调用API直接写屏画框。这种方式控制起来比较复杂,常常会由于interval设置得不当或因为机器性能的差异,出现取景框拖动时的轨迹残留与闪烁现象。在DSPack中可以用DSVideoWindowEx2来代替VideoWindow,因为它有Canvas,而且可以把视频输出到任何有Handle的控件上。如何利用它的这一特性来做可以移动的取景框,可以参考DSPack自带的一个例子(在Dspack'tDemoskDSVideoWindowEXkPlayWin中)。其实,用第二种方法也不简单。更简单更直接的办法是可以在SampleGrabber的OnBuffer事件中,利用其GetBitmap方法,将视频流导向到一个普通的Image上,而在一个\romage上,可以想放什么就放什么,控制起来很方便。因为窗口上没有必要放两个一样的视频,所以把VideoWindow的高和宽都设置成了0。这是个典型的懒人懒办法,其它副作用没发现,只是多了个Image。
(4)视频设备的属性设置
有时候连接到程序中的视频设备并没有工作在想要的模式中,或者为了利用它们自带的一些功能,来改善画面的质量,而又想在程序中直接调出如图4所示的设置窗口时,就需要用到DsUtil的HaveFilterPropertyPage()、ShowFilterPropertyPage()和ShowPinpropertyPageO了。
4 结束语
本文对“数码摄像”的主要功能(6种)作了介绍,并描述了如何实现一个最基本的数码摄像应用过程,但在实际中要考虑的因素问题还有很多,如:错误控制、自适应视频流的大小、允许视频的缩放、照片的存储控制、操作人员的权限控制、头像的自动切割等等。
关键词:数码摄像;DSPack;DirectX;Direct Show
0 引言
在招生信息采集工作中,一个非常重要的部分就是采集考生的肖像信息。随着考生人数的激增与工作要求的提高,肖像采集模式的不断调整,从最早的扫描仪扫描照片、数码相机联机拍摄一直到现在的视频捕获卡+摄像机快速采集,以不断适应招生形势的变化。我们把联机直接拍摄考生肖像的程序叫数码摄像程序。对于数码摄像程序,早期大多利用Video forWindow编写,它支持的设备种类少,且实现难度较高。现在利用Direct Show可以开发出支持摄像头、内置或外置视频采集卡、1394卡、内置或外置电视卡等多种设备的数码摄像程序,但直接用Direct Show开发,难度同样很高且开发效率也不高。可是有了DSPack情况就完全不同了,利用它来开发一个数码摄像程序,几乎是一件轻而易举的事情。
DSPack是一组封装了MS Direct Show和DirectX技术的组件,用于在安装了DirectX9的Windows 9x、ME、2000和Windows XP系统上的多媒体应用系统的开发。它支持Delphi5、6、7和C++ Builder 6,它不仅功能强大而且完全免费。本文对利用DSPack开发视频捕获方式的数码摄像程序做一个粗浅的介绍。
1 DSPack的安装
DSPack的下载地址为: http://www.progdigy.com/modules.php?name=DSPack,当前版本是2.3.4。为了避免不必要的麻烦,先要确认系统中已装上了DirectX9,然后再安装DSPack。如果想进行VMR、Direct3D或ASF方面的开发,则还需要下载并安装一些别的内容(请参考所下载的DSPack234.zip中所含Readme.htm中文件的相关内容)。下面是DSPack的安装步骤:
(1)将DSPack解压至任意目录。假设解压至Programfiles\DSPack目录,然后查看,有没有只读属性的文件,如果有,请把只读属性去掉;
(2)以Delphi 7为例,在Tools>Environment Options>Li-brary>Library path中,添加以下搜索路径:
Program files\DSPack\src\Directx9
Program files\DSPack\src\DSPack
(3)用Files>open分别打开Program files\packages下的DirectX9_D7.dpk和DSPack_D7.dpk按Compile钮进行编译;
(4)最后打开Program files\packages下的DSPackDesign_D7.dpk,按Install钮进行安装。
以上步骤如果顺利完成,并且在Delphi工具栏上出现了如图1所示的DSPack工具栏,则安装成功。
2 一个最基本的摄像程序功能概述
它由预览窗口、取景框、照片名输入框、拍摄钮、照片和设备连接与设置这六个部分组成。其使用步骤与方法为:首先,在程序运行时所显示的视频设备下拉列表中,选中其中一个(如果有多个的话),按连接按钮,程序就会连接指定的视频设备,如果连接正常就会在预览窗口中即时显示被拍摄对像;然后输入照片名,自由拖动取景框,框住要拍摄的部分(通常是头像),按拍摄按钮就可以把取景框中的内容拍摄下来显示在照片上,并同时保存为“照片名.jpg”。
图2所示,这是通过一个Logitech QuickCam Pro 4000摄像头拍摄某游戏杂志的封面女主角所看到的程序运行效果截图。
3 关键点说明
(1)所用到的DSPack组件
FilterGraph、Filter、SampleGrabber和VideoWindow各一个,将Filter、SampleGrabber和VideoWindow的FilterGraph属性都设置成FilterGraph的name,并注意将FilterGraph的Mode属性设置成gmCapture。
DSPack及普通VCL的组件分布如图3所示。
(2)视频设备的联接因为是要用来拍摄照片,所以我们要求只列出支持DireShow的视频设备就可以了,否则在设备列表中将出现一大堆与应用无关的设备。方法是声明一个TsysDevEnum型变量sysdev,在表单的OnCreate中,利用TSysDevEnum.Create(CLSID_VideolnputDeviceCategory)把视频设备列表取到sysdev中。
(3)取景框的制作
如果用Video for Window方式开发过视频捕获程序,就会知道要在一个视频流上放一个框不是一件容易的事——任何控件往上一放,只要一连接视频,它就会消失。传统的办法是放一个Timer,在OnTimer事件中不停地调用API直接写屏画框。这种方式控制起来比较复杂,常常会由于interval设置得不当或因为机器性能的差异,出现取景框拖动时的轨迹残留与闪烁现象。在DSPack中可以用DSVideoWindowEx2来代替VideoWindow,因为它有Canvas,而且可以把视频输出到任何有Handle的控件上。如何利用它的这一特性来做可以移动的取景框,可以参考DSPack自带的一个例子(在Dspack'tDemoskDSVideoWindowEXkPlayWin中)。其实,用第二种方法也不简单。更简单更直接的办法是可以在SampleGrabber的OnBuffer事件中,利用其GetBitmap方法,将视频流导向到一个普通的Image上,而在一个\romage上,可以想放什么就放什么,控制起来很方便。因为窗口上没有必要放两个一样的视频,所以把VideoWindow的高和宽都设置成了0。这是个典型的懒人懒办法,其它副作用没发现,只是多了个Image。
(4)视频设备的属性设置
有时候连接到程序中的视频设备并没有工作在想要的模式中,或者为了利用它们自带的一些功能,来改善画面的质量,而又想在程序中直接调出如图4所示的设置窗口时,就需要用到DsUtil的HaveFilterPropertyPage()、ShowFilterPropertyPage()和ShowPinpropertyPageO了。
4 结束语
本文对“数码摄像”的主要功能(6种)作了介绍,并描述了如何实现一个最基本的数码摄像应用过程,但在实际中要考虑的因素问题还有很多,如:错误控制、自适应视频流的大小、允许视频的缩放、照片的存储控制、操作人员的权限控制、头像的自动切割等等。