综合课程设计报告正文及参考文献2015

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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); %显示最大值法转化之后的灰度图像

相关文档
最新文档