综合课程设计报告正文及参考文献2015
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京理工大学
控制系统综合课程设计报告
姓名: 周宇浩学号:912110200339
学院(系):自动化
专业:自动化
指导教师: 戚国庆
基于VFW的视频图像采集与回放
摘要:随着网络和信息技术的日益深入以及广泛应用,人们对于多媒体技术的需求越来越高,其中视频采集技术是其中的关键环节。Windows系统为视频采集提供了多种实现技术,比如在MCI(多媒体控制接口)发展起来的VFW(Video for windows)和DirectShow技术。
本实验通过研究VFW技术结构和分析AVIcap类的视频采集原理,在windows 的VC++6.0编程环境中实现了对视频设备的枚举和采集,灰度化并预览视频的一些功能。
关键词:视频采集 VFW VC++ 灰度化
引言:视频图像的采集与处理在现今的图像处理系统中占有重要地位。微软推出的VFW是关于数字视频的一个开发包,优点是不依赖任何硬件,提供了标准的开发接口,使得开发过程变得方便快捷,尤其适用于现在的USB接口的各种摄像头。
1、VFW结构和开发环境简介
VFW主要由以下六个模块组成:
(1)AVICAP.DLL:包含了执行视频捕获的函数,它给AVI文件I/O和视频、音频设备驱动程序提供一个高级接口;
(2)MSVIDEO.DLL:用一套特殊的DrawDib函数来处理屏幕上的视频操作;
(3)MCIAVI.DRV:此驱动程序包括对VFW的MCI命令的解释器
(4)AVIFILE.DLL:支持由标准多媒体I/O(mmio)函数提供的更高的命令来访问.AVI 文件;
(5)压缩管理器(ICM):管理用于视频压缩-解压缩的编解码器(CODEC);
(6)音频压缩管理器ACM:提供与ICM相似的服务,不同的是它适于波形音频。
在VC++开发环境中调用VFW和使用其它开发包没有什么不同,只是需要将VFW32.lib文件加入工程中,但在开放视频捕捉与压缩管理程序时需要其它软件硬件设置。VFW为AVI文件提供了丰富的处理函数和宏定义,AVI文件的特点在于它是典型的数据流文件,它由视频流、音频流、文本流组成。所以对AVI文件的处理主要是处理文件流。
计算机系统:win7,64位旗舰版,开发环境:VC++6.0,由于使用了VFW开发包,所以要在头文件里面加上#include < vfw.h >和#pragma comment(lib,"vfw32.lib")
2、枚举计算机采集设备
枚举采集设备主要通过capGetDriverDescription函数来实现。可以通过循环枚举索引值为 0-9 时函数的返回值,如果返回为真则此索引对应的设备存在,就可以获得设备的描述信息。流程如下:
Step1:定义设备名称和版本号
Step2:设置0-9的循环
Step3:如果设备返回值为True,则添加驱动器名称到列表组合框中
用capGetDriverDescription函数去获取机器上安装的捕捉驱动的名字和版
本
char szDeviceName[80];//用来存放设备名称
char szDeviceVersion[80];//用来存放驱动版本
for(wIndex=0;wIndex<10;wIndex++)
{
if(capGetDriverDescription(wIndex,szDeviceName,sizeof(szDeviceName), szDeviceVersVersion,sizeof(szDeviceVersion))
//wIndex:索引号
{
//把驱动的名字添加到一个list里面,来供使用者选取;
}
}
3、视频源连接及视频预览
首先通过capCreateCaptureWindow函数来创建一个采集窗体:
m_hWndVideo = capCreateCaptureWindow (
Mycap // 窗口名称
WS_CHILD | WS_VISIBLE, //窗口类型
150, 40, 250, 250, //窗口位置和尺寸
m_hWnd, //父窗口的句柄
0 //窗口的ID号)
然后将创建的窗体连接到视频设备驱动上:
m_flag = capDriverConnect (m_hWndVideo, 0)
最后是设置帧数和显示方式:
capPreviewRate (m_hWndVideo, 20);
CapPreview (m_hWndVideo, TRUE);
这样,就完成了视频预览
4、视频灰度化
灰度图就是只包含亮度不包含色彩信息的图像。计算机把亮度值进行量化分成0-255共256个级别,其中0最暗,255最亮。对于RGB图像进行灰度化,就是对图像的RGB三个分量进行加权平均得到最终的灰度值。一般有:(1)加权平均法:Gray=B;Gray=G;Gray=R,即用R、G、B三个分量以不同的权值进行加权平均;(2)最大值法Gray=max(B+G+R),将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。(3)平均值法:Gray=(B+G+R)/3 将彩色图像中的三分量亮度求平均值得到一个灰度图。
灰度化视频预览的实现步骤为:
Step1:通过回调函数读取采集设备中的每一帧的位图;
Step2:采用灰度化算法将位图灰度化;
Step3:把灰度化以后的数据写入图片矩阵;
Step4:不断的将灰度化以后的图像刷新到灰度化预览区域实现灰度化预览。
部分代码如下:(matlab)
x=imread('c:\test\1.jpg'); %读取RGB格式的图像
y1=rgb2gray(x); %用已有的函数进行RGB到灰度图像的转换
[rows , cols , colors] = size(x); %得到原来图像的矩阵的参数
y2=zeros(rows,cols); %用得到的参数创建一个全零的矩阵,这个矩%阵用来存储用下面的方法产生的灰度图像
y2=uint8(y2); %将创建的全零矩阵转化为uint8格式,因%为用上面的语句创建之后图像是double型的
y3=zeros(rows,cols);
y3=uint8(y3);
for i=1:rows
for j=1:cols
sum1=0;
sum2=0;
for k=1:colors
sum1=sum1+x(i,j,k)/3; %用均值法进行RGB到%灰度图像的转换
sum2=sum2+max(x(i,j,k));%用最大值法进行%RGB到灰度图像转换end
y2(i,j)=sum1; %将得到的加权平均值作为对应像素点的灰度值
y3(i,j)=sum2; %将得到的简单平均值作为对应像素点的灰度值
end
end
imwrite(y1,'c:\test\lan1.jpg'); %将转换后图像以bmp格式写入文件1
imwrite(y2,'c:\test\lan2.jpg'); %将转换后图像以bmp格式写入文件2
imwrite(y3,'c:\test\lan3.jpg'); %将转换后图像以bmp格式写入文件3
subplot(2,1,1); %显示第1幅图像
imshow(x); %显示原来的RGB图像
subplot(2,2,2); %显示第2幅图像
imshow(y1,256); %显示经过系统函数运算过的灰度图像
subplot(2,1,1); %显示第3幅图像
imshow(y2,256); %显示均值法转化之后的灰度图像
subplot(2,2,1); %显示第4幅图像
imshow(y3,256); %显示最大值法转化之后的灰度图像