2023年7月26日发(作者:)
目录
基于图像处理运动物体识别
目 录
第一章 绪论 ................................... 错误!未定义书签。
1.1课题的背景和意义 ........................ 错误!未定义书签。
1.2国内外研究动态 .......................... 错误!未定义书签。
第二章 视频捕捉相关技术概述 .................... 错误!未定义书签。
2.1 USB2.0接口规范概述 ..................... 错误!未定义书签。
2.1.1 简介 .............................. 错误!未定义书签。
2.1.2 USB2.0物理结构概述 ............... 错误!未定义书签。
2.1.3 USB2.0系统的构成 ................. 错误!未定义书签。
2.1.4 USB2.0的主要优点 ................. 错误!未定义书签。
2.2 Video for windows技术架构 .............. 错误!未定义书签。
2.2.1 VFW简介 .......................... 错误!未定义书签。
2.2.2 VFW体系结构 ...................... 错误!未定义书签。
2.2.3 VFW视频捕获模块AVICap ............ 错误!未定义书签。
2.2.4 AVICap窗口类常用的数据结构及窗口类错误!未定义书签。
2.2.5 利用VFW技术实现视频捕捉的工作流程 错误!未定义书签。
2.2.6 VFW技术实现视频捕获的优缺点 ...... 错误!未定义书签。
第三章 运动检测技术概述 ........................ 错误!未定义书签。
3.1 运动图像的含义 ......................... 错误!未定义书签。
3.2 图像运动检测技术概述 ................... 错误!未定义书签。
3.3 运动检测的典型应用 ..................... 错误!未定义书签。
3.4 运动检测的发展特点 ..................... 错误!未定义书签。
3.5 运动图像目标检测的研究 ................. 错误!未定义书签。
第四章 视频捕获的设计方案与实现 ................ 错误!未定义书签。
4.1 开发环境介绍 ........................... 错误!未定义书签。
目录
4.2 视频捕获工具的选择 ..................... 错误!未定义书签。
4.3 实现视频捕获的基本方法 ................. 错误!未定义书签。
4.4 实现视频捕获的具体步骤 ................. 错误!未定义书签。
4.4.1 实现视频捕获基本功能的源码 ........ 错误!未定义书签。
4.4.2 实现单帧捕捉 ...................... 错误!未定义书签。
4.4.3 实现视频录像方式一 ................ 错误!未定义书签。
4.4.4 实现视频录像方式二 ................ 错误!未定义书签。
第五章 运动检测监控录像设计与实现 .............. 错误!未定义书签。
5.1 概述 ................................... 错误!未定义书签。
5.2 基本的研究思路 ......................... 错误!未定义书签。
5.3 实现的步骤 ............................. 错误!未定义书签。
5.4 功能的改进 ............................. 错误!未定义书签。
5.5 总结 ................................... 错误!未定义书签。
第六章 论文总结与展望 .......................... 错误!未定义书签。
6.1 课题完成情况 ........................... 错误!未定义书签。
6.2 主要的研究成果 ......................... 错误!未定义书签。
6.3 存在的不足 ............................. 错误!未定义书签。
6.4 工作展望 ............................... 错误!未定义书签。
参考文献 ...............................................................................................................47
致谢 .......................................................................................................................49
I 第一章 绪论
第一章 绪论
1.1课题的背景和意义
21世纪是信息化的时代,社会将由工业化社会转变为信息化社会,视频技术也因此而得到高速发展。它广泛应用于社会生活的各个方面,包括视频会议、监控系统、可视电话技术以及医疗影像系统等等。人们的生活也得到了很大的变化,人们可以实时地在家里就看到远在千里之外的事情。近年来,视频信号采集与存储在各行各业得到了广泛的应用,生活中有小区安全监控,电讯行业有机站监控,银行系统有柜员监控和金库监控,交通方面有违章和流量监控等等。因此开发带有视频捕捉和监控的程序在日常生活中是非常实用的。
在这些视频应用领域中,使用USB2.0摄像头进行图像采集和运动图像的检测就是其中的一个方面,USB2.0接口具有传输速度快、即插即用、使用方便等优点,因此USB摄像头图像采集技术就将成为图像采集和处理必备的基本技术。通过摄像头对感兴趣的目标或地点进行拍摄并且存储,可以获取视频录像,作为监控之用,在银行、商场、交通路口等有广泛的应用。其次当环境改变,拍摄目标运动时,也可以实时监控并采集运动的图像,并且存储到一个特别的地方,实现视频监控。可以应用于工矿企业、机关学校、银行保卫、公安报警、仓库、车站、码头、宾馆等单位,以实时监视、控制和报警等特点深受广大用户的欢迎,并取得了较大的经济效益与社会效益[8][13]。
运动检测的目的是从序列图像中将变化区域从背景中分割出来。由于光照的变化、背景混乱运动的干扰、运动目标的影子、摄像机的抖动以及运动目标的自遮挡和互遮挡现象的存在,这些都给运动目标的正确检测带来了极大的挑战。运动目标的正确检测与分割影响着运动目标能否正确跟踪和分类.因此成为计算机视觉研究中一项重要的课题[18]。
1.2国内外研究动态
国内外在视频信号的采集与存储方面做了大量的研究工作。目前,除了对一般基于Windows系统下的视频采集与存储、单片机系统下的视频监控设备以外,在高速视频采集、存储和传输,视频采集存储系统的小型化等方面,均取得了许多重要成果。
0
第一章 绪论
近年来智能交通系统(ITS)在欧美得到快速发展,它是一种基于图像识别技术的非接触式交通参数视频检测方法,它利用数字图像识别技术,对用高速摄像机拍摄的交通现场画面进行处理,获得被检测车道上车型、车速、车流量等交通参数,为交通控制和管理提供准确的交通流数据,从而更有效地进行交通控制和管理。与传统的接触检测方式相比,它的工作量小,检测范围大,系统可靠性高,是一种很有前途的方法。
运动分析是近年来计算机视觉领域中备受关注的前沿方向,尤其是在美国、英国等发达国家已经开展了大量相关项目的研究。1997年美国国防高级研究项目署(Defense Advanced Research Projects Agency)设立了卡内基梅隆大学为首、麻省理工学院等高校参与的视觉监控重大项目VSAM(visual
surveillance and Monitoring ),英国的雷丁大学已开展了对车辆和行人的跟踪及其交互作用识别的相关研究。在国内,运动图像分析已在人体运动检测与跟踪、智能交通、机器人视觉、运动目标检测与跟踪等诸方面展开了深层次研究。
总之,在多媒体技术飞速发展的今天,视频采集与存储系统将得到广泛的应用,并且不断改进。目前,实现视频捕获主要有两种方法,一种是利用视频捕获卡所附带的SDK开发工具。开发者只需利用采集卡所提供的控件就能方便的进行二次开发。开发简便、采集性能好是其最大的优点。同时,缺点也是显而易见的:这种捕获方法的实现是与设备有关的,依赖于视频捕获卡与摄像头的类型,不利于灵活的应用,而且其封装好的SDK函数不利于用户作更底层一点的操作,扩展性不好。
另一种方法是利用数字视频处理软件开发包直接对数字化的视频捕获设备捕获到的数据进行处理。用它开发应用程序的特点是捕获视频时不依赖专用的硬件设备,而且应用灵活。随着计算机总体性能的不断提升,用软件来实现视频采集过程也能获得较好的图像效果。windows平台为多媒体信息技术的处理和集成提供了强有力的支持,也为数字视频信息的实时捕获提供了多种实现技术。主要有早期的Microsoft多媒体控制接口MCI(Multimedia
Control Interface)这里主要指 Video for Windows(VFW),以及现在DirectShow.技术。 1
第二章 视频捕捉相关技术概述
第二章 视频捕捉相关技术概述
2.1 USB2.0接口规范概述
2.1.1 简介
USB是英文Universal Serial Bus的缩写,中文含义是“通用串行总线”。在视频存储和图像宽带领域中,经常遇到实时高速数据传输的问题。2000年4月,由Intel、Microsoft、NEC、Compaq、Lucent、Phillips等公司发布了USB2.0版本,其传输速率提高到48OMb/s,一时间USB红遍全球.现在USB支持3种传输速率:低速(1.5Mb/s)、全速(12Mb/s)和高速(48OMb/s),四种传输类型:块传输、同步传输、中断传输和控制传输。这使USB应用起来灵活方便,能够满足多种外设需要。USB2.0在传输速度方面有很大改进,但USB设备之间直连互通仍需依赖计算机主机,仍没有合适的直通解决方案。2001年底,USB开发者论坛USBIF(USB Implementers Porum)发布了USB2.0补充规范USB
0n-The-G。使支持该协议的USB外设可以以主机的身份和另外特定的一组外设直接通信,进一步拓展了USB技术的发展空间[8]。
2.1.2 USB2.0物理结构概述
在终端用户看来,USB系统就是USB设备到主机的简单连接,但对开发人员来说,这种连接可被分为三个逻辑层:功能层、USB设备层和USB总线接口层,且每一层都由主机和USB设备的不同功能模块组成。
USB规范向下兼容,在物理结构上,USB2.0规范具有与USB1.x相同的结构特征,采用分层的星型结构:在连线上,可以使用USB1.1系统已有的设备连线,信号线长度一般不能超过5m。在扩展USB设备连接时,用户可采用级联USB集线器的方式,最多可级联5级USB集线器,使USB设备数量达到127个。
2.1.3 USB2.0系统的构成
USB系统主要由主控制器(Host Controller)、USB、Hub和USB外设(Perip-
herals Node)组成系统拓扑结构[14],如图2.1所示。
它的硬件组成:一个实用的USB数据采集系统包括A/D转换器、微控制 0
第二章 视频捕捉相关技术概述
器以及USB通信接口。为了扩展其用途,还可以加上多路模拟开关和数字I/O端口。系统的A/D、数字I/O的设计可沿用传统的设计方法,根据采集的精度、速率、通道数等诸元素选择合适的芯片,设计时应充分注意抗干扰的性能,尤其对A/D采集更是如此。
在微控制器和USB接口的选择上有两种方式,一种是采用普通单片机加上专用的USB通信芯片。另一种方案是采用具备USB通信功能的单片机。
主控制器
HUB
设置
HUB
HUB
设备
HUB
设备 设备
图2.1 USB总线的拓扑结构
2.1.4 USB2.0的主要优点
速度快。USB有高速和低速两种方式,主模式为高速模式,速率为l2Mbps,另外为了适应一些不需要很大吞吐量和很高实时性的设备,如鼠标等,USB还提供低速方式,速率为1.5Mb/s[14]。
设备安装和配置容易。安装USB设备不必再打开机箱,加减已安装过的设备完全不用关闭计算机。所有USB设备支持热拔插,系统对其进行自动配置,彻底抛弃了过去的跳线和拨码开关设置。
易于扩展。通过使用Hub扩展可拨接多达127个外设。标准USB电缆长度为3m (5m低速)。通过Hub或中继器可以使外设距离达到30m。能够采用总线供电。USB总线提供最大达5V电压、500mA电流。
使用灵活。USB共有4种传输模式:控制传输(C0NTR0L)、同步传输 1
第二章 视频捕捉相关技术概述
(Synchronization)、中断传输(interrupt)、批量传输(bulk),以适应不同设备的需要。
2.2 Video for windows技术架构
2.2.1 VFW简介
VFW是微软公司1992年推出的关于数字视频的一个软件包。它能使应用程序数字化并播放从传统模拟视频源得到的视频剪辑。VFW的一个关键思想是播放时不需要专用硬件。为解决数字视频数据量大的问题,需要对数据进行压缩。于是,它引进了AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,在AVI文件中交替存储视频帧和与之相匹配的音频数据。VFW给程序员提供.VBX和AVICap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。VFW编程充分体现了C++的类封装风格,使得进行视频软件开发的程序设计工程师,完全不必了解艰深而晦涩的图像压缩原理和图像格式,直接面对的是面向对像的开发模块的标准化的用户界面 [2]。
2.2.2 VFW体系结构
VFW以消息驱动方式对视频设备进行存取,可以很方便地控制设备数据流的工作过程。它主要包括多个动态连接库,通过这些组件间的协调合作,来完成视频的捕获、视频压缩及播放功能。VFW体系结构如图2.2所示,
VFW主要由以下6个模块组成[7]:
(1)AVICA:包含了执行视频捕获的函数,它给AVI文件I/O和视频,音频设备驱动程序提供了一个高级接口。
(2)MSVID:用一套特殊的DrawDib函数来处理屏幕上的视频操作。
(3)MCIAV:此驱动程序包括对VFW的MCIA命令的解释器。
(4)AVIFI:支持由标准多媒体I/O(MMIO)函数提供的更高的命令来访问.AVI文件。
(5)压缩管理器(ICM):管理用于食品压缩-解压缩的编解码器(CODEC)。
2
第二章 视频捕捉相关技术概述
(6)音频压缩管理器ACM:提高与ICM相似的服务,不同的是它适于波形音频。
图2.2 VFW体系结构图
2.2.3 VFW视频捕获模块AVICap
Visual C++ 在支持VFW方面提供有vfw3、msacm、
winmm.lib等类似的库。特别是它提供了功能强大、简单易行、类似于MCIWnd的窗口类AVICap。AVICap为应用程序提供了一个简单的、基于消息的接口,使之能访问视频和波形音频硬件,并能在将视频流捕获到硬盘上的过程中进行控制[2]。
AVICap支持实时的视频流捕获和单帧捕获并提供对视频源的控制。虽然MCI也提供数字视频服务,比如它为显示.AVI文件的视频提高了avivideo命令集,为了视频叠加提供了overlay命令集,但这些命令主要是基于文件的操作,它不能满足实时地直接从视频缓存中取数据的要求,对于使用没有视频叠加能力的捕获卡的PC机来说,用MCI提供的命令集市无法捕获视频流的。而AVICap在捕获视频方面具有一定的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高。同时,它也可将数字视频捕获到文件。
使用AVICap窗口类可以轻易将视频捕捉和应用程序相结合。AVICap给应用程序提供了一个非常简单的、基于消息的从硬件访问视频 3
第二章 视频捕捉相关技术概述
和声音的接口,使应用程序可以控制视频从捕获到存盘的过程。
AVICap支持实时的视频流捕捉和单帧捕捉。该类提供了对MCI视频源的完全控制,这样,开发人员就可以任意确定视频捕捉的起点和终点,并且有可能对其中的一个点即单帧进行访问。用AVICap窗口类创建的窗口可以完成以下工作[6]。
(1) 将一视频流和音频流捕获到一个AVI文件中。
(2) 动态的和视频或声音输入设备进行连接和断开连接。
(3) 使用叠加或者预览方法对输入信号进行实时显示。
(4) 设定捕捉频率。
(5) 显示控制视频源、视频格式和视频压缩的对话框。
(6) 装载、创建或保存调色板。
(7) 将图片或调色板复制到剪贴板上。
(8) 单独捕捉一副图像并且保存为一张与设备无关的图片文件(DIB)。
2.2.4 AVICap窗口类常用的数据结构及窗口类
AVICap 为应用程序提供了一个简单的、基于消息的接口,使之能够访问视频和波形音频硬件,并能够在视频流捕获到硬盘上的过程中进行控制。这些接口函数,是高级的,经过了优化的,我们利用它们来创建自己的应用程序具有较大的灵活性。
下面是视频捕捉以及处理过程中涉及到的几个很重要的结构:
(1) CAPSTATUS:此结构定义了捕获窗口的当前状态,如:以象素为单位表示图像的高、宽、预览和重叠方式的标志量,尺寸缩放的标志量等。
(2)CAPDRIVERCAPS:此结构定义了捕获驱动器的能力,如有无视频叠加能力,以及能否通过用户直接操作捕获窗口而查看视频源、视频格式、视频源、视频显示。
(3)CAPTUREPARMS:包含控制视频流捕获过程的参数,如捕获帧频,指定键盘或鼠标键以终止捕获,捕获时间限制等;
以上3个结构都专门有对应的函数来设置和获得相应结构所包含的相应信息。
(4)VIDEOHDR:定义视频数据块的头信息。在编写回调函数时常用到 4
第二章 视频捕捉相关技术概述
其数据成员lpData(指向数据缓存的指针)和dwBufferLength(数据缓存的大小)。
VFW中视频捕捉编程常用的一些VFW函数和宏如下表1所示[16]:
表1 视频捕捉常用的VFW函数和宏
VFW函数和宏
CapCreateCaptureWindow
CapDriverConnect
CapDriverDisconnect
功能描述
创建捕获窗口
消息
连接窗口与驱动器 WM_CAP_DRIVER_CONNECT
断开窗口与驱动器的连接
WM_CAP_DRIVER_DISCONNECT
CapDriverGetCaps
capGetStatus
得到驱动器的性能 WM_CAP_DRIVER_GET_CAPS
得到捕获窗口的状态
WM_CAP_GET_STATUS
CapPreviewRate
capPreiew
capOverlay
CapDlgVideoFormat
CapDlgVideoSoure
CapDlgVideoCompression
设置预视帧率 WM_CAP_SET_PREVIEWRATE
设置为预视帧方式 WM_CAP_SET_PREVIEW
设置为覆盖方式
设置格式对话框
WM_CAP_SET_OVERLAY
WM_CAP_DLG_VIDEOFORMAT
设置图像源对话框 WM_CAP_DLG_VIDEOSOURCE
设置压缩对话框 WM_CAP_DLG_VIDEOCOMPRESSION
CapCaptureGetSetup
CapCaptureSetSetup
CapFileSetCaptureFile
得到设置参数
设置参数
设置捕捉文件
WM_CAP_GET_SEQUENCE_SETUP
WM_CAP_SET_SEQUENCE_SETUP
WM_CAP_FILE_SET_CAPTURE_FILE
CapCaptureSequence
CapCaptureStop
CapGrabFrameNoStop
CapEditCopy
捕捉到文件
停止捕捉
截取当前图像
WM_CAP_SEQUENCE
WM_CAP_STOP
WM_CAP_GRAB_FRAME_NOSTOP
把图像拷入剪贴板 WM_CAP_EDIT_COPY
通过使用AVICap窗口类函数,可以在应用系统中方便的集成视频采集 5
第二章 视频捕捉相关技术概述
功能。它为应用程序提供了一个基于消息的简单的接口,从而使之能够访问视频采集硬件,并能控制将所捕捉的视频流写到磁盘的过程。用AVICAP窗口类函数创建的窗口(通过CapCreateCaptureWindow函数创建)被称为捕获窗,该窗口的客户区用来显示采集卡传入计算机的实时视频图像,其窗口风格一般为WS_CHILD和WS_VISIBLE。在视频采集之前需要创建一个捕获窗,所有的视频操作及其设置都以它为基础。
AVICap在显示视频图像时提供了以下两种模式:
(1)预览(Preview)模式:该模式把数字化的帧从捕捉硬件传到系统内存,显示要占系统资源,视频由系统调用GDI函数在捕获窗中显示,Preview模式的显示速度慢,该模式的视频格式为RGB格式。
(2)叠加(overlay)模式:在该模式下将捕捉缓冲区的内容直接在监视器上显示,而不占用CPU资源。视频卡将VGA的输出信号与其自身的输出信号叠加合并,所得的组合信号显示在计算机的监视器上。这种方式的视频显示比预览方式有更好的连贯性。所捕获的视频数据的显示不需要占系统资源,显示速度快,同时不影响系统的其它任务。
但是如果应用程序要对捕获的图像在显示之前进行加工,则最好在预览模式下进行,先把图像数据送到系统内存,根据需要对图像进行处理后再把图像显示出来。该模式为部分采集设备所具有的能力,因此在视频采集程序中要先加以判断,以选择最佳的显示模式。
2.2.5 利用VFW技术实现视频捕捉的工作流程
利用VFW技术可以方便的实现视频的捕捉,下面我们讨论一下进行视频捕捉的基本工作流程,如下图2.3所示:
(1)创建捕获窗口
捕获窗口也就是被采集到的图像的预览窗口,它是其他捕获工作的基础。通过函数CapCreateCapturewindow可完成捕获窗口的创建,并取得该捕获窗口的句柄。
(2)注册回调函数
回调函数由开发人员预先定义好,事件发生时由操作系统来调用,调用的接口也是由系统定义好的。AVICap中定义了多个的回调函数的形式。
(3)设置捕获窗口的相关参数
6
第二章 视频捕捉相关技术概述
用宏CapCaptureGetSetup来获得当前采集的参数设置或默认的参数设置,该宏返回的值是一个CAPTUREPARMS结构。可以根据具体的需要来修改
创建视频捕捉窗口
注册系统回调函数
设置捕获窗口相关参数
与视频采集设备连接
获取视频采集设备的能力及状态信息
设置捕捉窗口的显示
捕捉视频到缓存或文件并进行处理
终止视频捕捉并断开与视频捕获设备的连接
图2.3 利用vfw进行视频捕获的流程图
CAPTUREPARMS结构中的相应变量来设置捕获参数,设置结束捕获的方式。
(4)与视频采集设备相连接
可以直接用宏CapDriverConnect(hWnd,Index)将采集窗口和指定的采集设备连接起来(hWnd是采集窗口的句柄,Index是指定的采集设备的号码),也可以先用CapGetDriverDescription函数获得系统中所有的采集设备的名称和其版本信息,然后再选择其中一个采集设备将它和采集窗口。
(5)获取视频采集设备的能力及状态信息
用宏CapDriverGetCaps来获取视频设备的能力。用宏CapGetstatus来获取视频设备的状态。
(6)设置捕捉窗口的显示模式
7
第二章 视频捕捉相关技术概述
上一步获取的视频设备的能力存放在CAPDRIVERCAPS结构中,可以通过其fHasOverlay域来判断设备是否具备Overlay模式。若具有Overlay模式就可以通过Capoverlay启动,否则,可以通过CapPreview启动Preview模式。
(7)捕捉图像到缓存或文件并进行处理
这就涉及到前面介绍的视频数据传输的两种模式。
若准备对捕获的数据进行实时处理就用到回调机制可以注册函数CapSetCallbackOnFrame,当一帧结束就立刻产生回调;若要及时保存捕获到的视频数据,则可以调用宏CapCaptureSequence,将数据存入文件中。其扩展名为avi。
(8)终止视频捕捉并断开与视频采集设备的连接
结束捕获时,应进行各种清理工作,捕获终止、取消回调函数、释放内存、断开驱动给其他设备使用视频硬件等。
2.2.6 VFW技术实现视频捕获的优缺点
通过分析VFW的模块AVICap窗口实现视频捕获的过程,我们知道,AVICap窗口类封装了有关视频捕获的底层API函数,才使得编程人员在编写的应用程序中实现了视频捕获功能。它提供一个简便的、基于消息的接口,程序通过它可以完成由视频捕获硬件获取数据,并按照需要的格式进行存储或进行其它处理。
VFW的优势 在于简单直观,能够比较快捷地运用回调函数、宏等函数完成实时的视频捕获和单帧捕获并提供对视频源的控制。AVICap类能直接访问视频缓冲区,而不需要生成中间文件,实时性很强,效率较高。
同时,VFW也存在着一些缺点。首先,其结构化的编程模式已经落后于当前面向对象的程序设计思想,在整体上破坏了软件的体系结构。它支持的数据格式有限,只能存储、处理AVI的文件。另外,由于自1992年以来VFW技术的总体结构没有太大变化,采用VFW技术的捕获系统存在通用性差、维护困难、系统可扩展性差、不能很好地支持PCI总线、总线控制器等新的硬件技术等问题。在网络视频会议等领域迅速发展的今天,VFW架构自身固有的设计缺陷逐步显露出来,缺少对视频会议、电视观赏、视频捕捉以及处理附加数据流如垂直消隐间隔(VBI,Vertical Blanking Interval)等的关键功能支持。 8
第三章 运动检测技术概述
第三章 运动检测技术概述
3.1 运动图像的含义
与静止图像相比,动态图像的基本特征就是灰度的变化。具体说来,在对某一景物拍摄到的图像序列中,相邻两帧图像间至少有一部分像元的灰度发生了变化,这个图像序列就称之为动态图像序列。
造成灰度变化的原因是多种多样的,主要有以下几类[18]:
(1)景物本身发生了变化:物体发生了变形(扩大或缩小)或运动(旋转、平移);
(2)相机与景物发生了相对运动:相机的平移、旋转使图像内容发生了改变;
(3)照度变化:照射景物的光源发生变化导致物体亮度改变;
(4)上述几种情况的组合;
由此可见,图像灰度变化的原因很多,本文研究讨论的内容主要集中在景物与射相机之间相对运动所形成的动态图像上。而这种动态图像又分为两类:一类是背景是静止的,物体是运动的;另一类是背景是变化的,物体是运动的。在此我们主要研究的是背景是静止的,物体进入摄像机范围,即物体的运动引起的图像灰度变化。
我们通常在直观上将运动与变化联系起来,因此我们对运动分析的讨论就从观察序列中的两帧图像的差别开始。对于一个大场面的远景图像来说,从直观上看它们的差别不明显。但是在两帧图像相减后的差分图像上,差别就很明显了。从中可以很清晰地看出图像中发生了物体的运动变化。因此,在对图像进行质的描述后,我们就明显地感觉到运动分折对动态景物的理解是很有帮助的。
根据对运动图像的观察我们得出以下结论:运动可能导致灰度的时变。但反过来不成立的,即灰度的时变不一定就是由运动引起。照度和环境光反射的改变同样会引起灰度时变。本文我们研究的就是运动导致的灰度变化。
3.2 图像运动检测技术概述
数字图像处理是从20世纪60年代以来随着计算机技术和VLSL(Very
Large ScaleIntegrated)的发展而产生、发展和不断成熟起来的一个新兴技术领 0
第三章 运动检测技术概述
域,与人类视觉机理着迷的历史相比,它是一门相对年轻的学科。但在其短短的历史中,它却广泛应用于几乎所有与成像有关的领域,在理论上和实际应用上都取得了巨大的成就,并引起各方面人士的广泛重视。有几个因素表明数字图像处理领域将一直保持持续发展的势头。其主要因素是图像处理所需的计算机设备的不断降价,处理器和大容量存储器都一年比一年便宜。第二个因素是图像数字化和图像显示设备越来越普及。诸多迹象表明计算机设备的价格将继续下降。
运动目标的检测技术是通过对摄像机获取的动态序列图像进行分析数据量通常都很庞大,现有的算法在一般处理器上实现起来处理速度明显不足,实时性很差,离实用化还有相当的距离。如果采用专用的芯片组实现,虽然实时性得到了保证,但系统的灵活度会大大降低,不利于以后功能升级。近年来,出现了一些可视化的监控系统,可以满足人们“眼见为实”的要求,但这种监控系统较多地集中在基于PC机的图像监控,它要求监控人员不停地监视屏幕,获得视频信息,通过人为的理解和判断,才能得到相应的结论,做出相应的决策。而让监控人员长期盯着众多的电视监视器成了一项非常繁重的任务,特别在一些监控点较多的情况下,监控人员几乎无法做到完整全面的监控。对于更广泛的中、小型企业、办公室和家庭用户来说,更需要一种体积小、适于安装、操作简单、可靠性高、价格便宜同时具备自动化、智能化的数字图像监控产品,于是基于嵌入式的智能监控系统应运而生。对它的研究具有很大的实际意义。
3.3 运动检测的典型应用
基于运动图像的目标检测在科学技术研究和工程应用上有着广阔的应用前景[10]。例如:
(1)军事上:用于对空监视中的多目标跟踪机载或弹载前视红外图像中的目标检测、导弹动态检测等方面。
(2)工业上:用于工业过程控制、机器人视觉、白主运载器导航等方面。
(3)商用上:用于高清晰度电视及电视会议的动态图像传输中的频带压缩等方面。
(4)医学上:用于生物组织(如显微镜下的细胞和x光或超声波下的器官)运动分析等方面。
1
第三章 运动检测技术概述
(5)气象上:用于云图的分析预报。
(6)运输上:用于交通管理、运输工具的流量控制等方面。
3.4 运动检测的发展特点
运动目标检测方法多种多样,但到目前为止,还没有一个通用的算法,这是因为运动目标检测算法大多都是针对具体情况的。应用场合和场景观条件的不同,必然导致运动目标检测方法的不同。总结起来,运动标检测技术的发展有如下特点[14]:
1.形成了三种传统的运动目标检测方法:光流法、帧间差分法和背景减除法。其中基于差分图像的帧间差分法和背景消减法是目前应用视觉系统应用最广泛的检测方法。
2.传统检测方法不断改进。一方面,针对三种传统检测方法自身的不足和某些缺陷,提出了许多改进方法,使之更稳健,更实用;另一方面,将不同检测方法结合起来,克服单个方法的缺点,使其优点互补。这是运动目标检测技术研究的热点和重点之一。
3.新颖算法不断涌现。当一种技术滞留于传统算法的基础上时,这种技术也就失去了其应有的生命力。只有新颖算法的不断涌现,才能促进这种技术的蓬勃发展。曲线演化等新颖算法的出现,使运动目标检测技术的研究发展走上了一个新的台阶。新的检测算法是运动目标检测技术研究的另一热点和重点。
4.稳健性、准确性和实时性是运动目标检测技术研究和应用的主旋律。
3.5 运动图像目标检测的研究
运动目标是生活中常见的,如活动的动物,行驶的运载工具以及自然界其他运动物体等。利用图像捕捉并跟踪感兴趣的运动目标在许多领域有广泛的应用。运动目标如天文观测中的星体、气象分析中的云图,安全监视中的人或动物,交通管制中的汽车、飞机、轮船等。
对于运动图像的检测分析,背景图像是静止的情况,现阶段的研究成果比较成熟,也易于广泛实现,常见的有背景减除法、时间差分方法等,而对动态变化的背景图像,由于外界条件的复杂多变性,研究方法不可能完全一致,因而各研究方法也会有不同的适用性。目前常用的运动目标检测方法有三种:帧间差方法,背景减除和光流法。帧间差法方法是在连续的图像序列 2
第三章 运动检测技术概述
中两个或三个楣邻帧间采用基于像素的时间差分并且阈值化来提取出图像中的运动区域。背景减除法是目前运动分割中最常用的一种方法,它是利用当前图像与背景图像的差分来检测出运动区域的一种技术。它一般能够提供最完全的特征数据,但对于动态场景的变化,如光照和外来无关事件的干扰等特别敏感。光流法测采用了运动目标随时间变化的光流特性,如Meyer等通过计算位移向量光流场来初始化基于轮廓的跟踪算法,从而有效地提取和跟踪运动目标。
目标的运动图像序列为低信噪比情况下的目标检测提供了比目标静止时更多的有用信息,使得我们可以利用图像序列检测出真图像中很难检测出的目标。由运动目标所形成的图像序列可分为两种情况:一种是静止背景,一种是变化的背景。前一种情况通常发生在摄像机相对静止的状态,后一种情况通常发生在摄像机相对运动状态(如装在卫星或飞机上的监视系统)。从处理方法上看,一般是采用突出目标或消除背景的思想。对前一种情况可采用消除背景的方法,出来起来比较简单,如简单的帧间差分或自适应背景对消方法。对后一种情况,处理起来比较复杂,若采用消除背景的方法,则通常需要先进行帧间图像配准,若采用突出目标的方法,则需要在配准的前提下进行多帧能量积累和噪声抑制。此外,还可以采用光流模型方法,背景模型法,基于熵的方法等方法从运动速度上区分不同目标与背景。
3
第四章 视频捕获的设计方案与实现
第四章 视频捕获的设计方案与实现
4.1 开发环境介绍
在本论文中,使用的开发环境是Visual C++ 6.0软件。它是Microsoft公司推出的一个面向对象、功能丰富的可视化开发工具,是近十年来程序设计领域中最强大的开发工具之一。利用Visual C++ 6.0提供的高效Windows编程环境,可以编写各种各样的软件,尤其是其他语言所难以企及的关于底层操作的软件[1]。
Visual C++ 6.0之所以受到无数的程序员的青睐,主要是有3方面的原因:(1)它是C和C++的混合编译器,使得Visual C++ 6.0开发的程序具备了C和C++的高效、简洁的特点。(2)它是一种面向对象的语言,使得软件能够在源码级、类级、控件级等多个级别上重用,软件的开发效率大为提高。(3)借助于Microsoft出色的MFC类库和应用程序框架能够轻而易举开发出Windows标准界面的应用程序。
Visual C++ 6.0首先是一种程序设计语言,同时也是一个集成开发工具它提供了自动生成软件代码和可视化资源编辑的功能。Visual C++ 6.0是Windows环境下最主要的面向对象(Object Oriented)应用开发环境之一,它不仅是C++语言的集成开发环境,而且与Win32紧密相连。所以,使用Visual
C++ 6.0可以灵活地开发从底层软件到上层直接面向用户的软件。另外,在大型复杂软件的开发使用Visual C++ 6.0的调试工具可以有效地进行排错,开发环境是程序员与Visual C++ 6.0的交互界面,通过它程序员可以创建工程文件,创建或访问C++源代码、资源文件等。Developer Studio开发环境,即Visual
C++ 6.0的开发环境,问程序员提供了一个面向对象C++程序进行开发和调试的平台[3]。
在开始Visual C++ 6.0程序设计之前,首先应该对开发平台即Visual C++
6.0的集成开发环境(IDE)有一个了解。熟悉这个开发环境,能提供程序设计的效率,也能给我们创造一个舒心的开发界面。
启动程序后,我们可以看到一个窗口,如下图4.1所示,他的每个区域都有其特定的用途,我们可以重新布置各个区域来定制自己的开发环境,时期适合自己的特殊开发需要和个人习惯。
主界面窗口包括有以下几部分:1,工作区,它是确定开发项目中各部 0
第四章 视频捕获的设计方案与实现
分位置的关键工作区;2,输出窗格,它是向用户提供信息的地方,这些信息包括编译程序的进展说明、警告及出错的信息;3,编辑区,它是Visual
C++6.0中进行一切编译工作的区域,当编辑C++的源代码时将在这里显示代码编辑窗,当设计对话框时,窗口绘制器也在此显示;4,菜单栏,主要由File、Edit、View、Insert、Project、Build和Tools等组成,每个菜单又由多个选项构成;5,工具栏,它由某些操作按钮组成,分别对应着某些菜单选项或命令的功能。
菜单栏
工具栏
工作区窗格编辑区域
输出窗格
图4.1 Visual C++ 的开始主界面
Visual C++6.0大概可以分成三个主要的部分:
1. Developer Studio。这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft VisualC++”,所以很多人理所当然的认为,那就是Visual C++6.0了。其实不然,虽然Developer
Studio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道, 1
第四章 视频捕获的设计方案与实现
Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual
Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C++6.0,
它充其量只是Visual C++6.0的一个壳子而已。
2. MFC。从理论上来讲,MFC也不是专用于Visual C++6.0,Borland
C++, Builder C++和Symantec C++同样可以处理MFC。同时,用Visual C++6.0编写代码也并不意味着一定要用MFC,只要愿意,用Visual C++6.0来编写SDK程序,或者使用STL,ATL,一样没有限制。不过,Visual C++6.0本来就是为MFC打造的,Visual C++6.0中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C++6.0而不用MFC就等于抛弃了Visual C++6.0中很大的一部分功能。但是,Visual C++6.0也不等于MFC。
3.Platform SDK。这才是Visual C++6.0和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,Platform SDK是以Microsoft
C/C++编译器为核心(不是Visual C++6.0,看清楚了),配合MASM,辅以其他一些工具和文档资料。上面说到Developer Studio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成Visual Studio的基石。
下面进入到程序的具体编辑阶段。
4.2 视频捕获工具的选择
经过前面的讨论研究,我们知道VFW和DirectShow这两个开发包都能够完成对视频的捕获。DirectShow是微软公司在ActiveMovie和Video for
Windows的基础上推出的新一代基于COM的流媒体处理的开发包,与DirectX开发包一起发布。目前,DirectX最新版本为9.0。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。这样使在多媒体数据库管理系统(MDBMS)中多媒体数据的存取变得更加方便,但是实现过程复杂。而使用VFW的优势在于简单直观,能够比较快地完成捕捉操作,由于研究的需要要求,在此选择使用VFW进行本课题。
本课题主要是在PC机上用软件实现的,所需硬件主要是一台PC机和一个数字摄像头,该摄像头是USB2.0口的摄像头
4.3 实现视频捕获的基本方法
2
第四章 视频捕获的设计方案与实现
VFW (Video for Windows)函数是Windows环境下实现视频捕获的重要工具,是Windows操作系统增设的视频服务库。由于VFW函数可以方便地实现视频、音频数据流到AVI文件的存储,在Visual C++中也将VFW函数称为AVICAP窗口类函数。AVICAP窗口类为应用程序提供了一个基于访问视频采集硬件简便的、基于消息的接口,从而使之能访问视频和波形音频采集硬件,能灵活地实现从模拟视频源采集数字视频信号,并将所捕捉的视频流存储到磁盘或直接对视频缓存进行处理。通过使用AVICAP窗口类函数,我们能很方便地在应用程序中加入视频捕获功能。
利用VFW函数进行视频捕获的工作流程如图4.2所示,对应使用的AVICAP函数命令如下:
capCreateCaptureWindow();//创建视频捕获窗,并设置相关参数
capDriverConnect();//连接视频捕获设备
capDriverGetCaps();//获取摄像头的能力和状态
capPreviewRate();//设置显示频率
capPreview();//开始预览显示
capCaptureAbort();//终止视频捕获
capDriverDisconnect();//断开与视频采集设备的连接创建频捕获窗,设置相关参数
连接视频捕获设备
获取视频采集设备的能力及状态信息
设置显示频率
开始预览显示
视终止视频捕获并断开与食品采集设备的连接
图4.2 视频捕获流程
3
第四章 视频捕获的设计方案与实现
这里仅用了简单的7条命令,填上适当的参数,就可实现相当复杂的图像采集和显示功能。可见利用AVICAP函数,进行视频捕获的编程确实很方便。实际使用时,编辑程序,然后运行无错,就会弹出一个视频采集窗口,并在窗口中显示摄像头采集到的视频图像。
在VFW中,可以有3种方式实现视频录像。其中,最简单的方式是调用capFileSetCaptureFile函数和capCaptureSequence函数。该种方式存在许多缺点,例如,在录像时无法响应用户界面,无法实现视频压缩等。第二种方式是调用capCaptureSetSetup函数,将CAPTUREPARMS结构的fYield成员设置为TRUE,启动后台线程来实现录像,然后调用capDlgVideoCompression函数让用户选择压缩器进行压缩,最后调用capFileSetCaptureFile函数和capCaptureSequence函数开始录像。第二种方式的缺点是每次录像时都需要弹出一个对话框,让用户选择一种压缩器。第三种方式是注册回调函数capSetCallbackOnVideoStream,在回调函数中压缩数据并写入AVI文件。
下面我们先尝试使用方式一实现视频录像。
4.4 实现视频捕获的具体步骤
在自己原有的VC++工程文件中增加视频捕获功能的步骤如下:
(一) 建立一个基于对话框的工程。
(二)给工程文件增加VFW函数库。
(三)增加一个视频采集对话框,用来显示视频图像和相关命令按钮。
4.4.1 实现视频捕获基本功能的源码
工程文件中增加视频捕获功能源码的方法如下:
(一)给上述的视频采集对话框增加一个新类。
工程的头文件为:
#include "stdafx.h"
#include "VideoEncode.h"
#include "VideoEncodeDlg.h"
#include "math.h"
#include "vfw.h"
#include "VideoProc.h"
(二) 编辑原工程中的视图类文件,使得用户运行程序时,能够弹出视频采 4
第四章 视频捕获的设计方案与实现
集对话框,利用到的主要函数就是capCreateCaptureWindow()。
(三) 编辑视频采集对话框,添加“视频格式”、“视频源”、“冻结图像”、“解冻图像”、“关闭窗口”等5个按钮。此时,编译文件时并不能通过,我们文件前面添加全局变量声明:
CAPSTATUS sCapStatus;
CAPTUREPARMS sCapParms;
CAPDRIVERCAPS gCapDrvCaps;
HWND m_hWndVideo;
处理到此,我们可以再次编译并试运行工程文件。在程序没有错误的情况下,应该能弹出视频采集对话框,并且可以看到采集到的实时视频图像,同时可看到前面我们设置的五个按钮,此时点击这些按钮是没有任何操作发生的,因为我们还没有对它们进行编辑,所以它们还不能实现任何功能,视频采集对话框如下图4.3所示:
图4.3 视频采集窗口
给各个按钮增加相应的代码,我们就可以实现相应的功能,下面是我们添加代码的步骤。
(1)增加“视频格式”按钮对应的处理代码为:
void CVideoEncodeDlg::OnVideoformat()
5
第四章 视频捕获的设计方案与实现
{
if(capDlgVideoFormat(m_hWndVideo))
capGetStatus(m_hWndVideo,&sCapStatus,sizeof(CAPSTATUS));
}
此时,我们点击图4.3中的“视频格式”按钮,将会弹出一个视频格式设置的对话框。通过该对话框,可以对视频数据流的分辨率和像素深度(位)和压缩格式进行设置。我们本课题所使用的摄像头分辨率有五种可选,默认为320*240,而像素深度则有两种可选。 具体的对话框如下图4.4所示.
图4.4 视频格式设置
(2)通过编辑上面的“视频格式”按钮, 我们了解了添加代码实现功能的一般方法,现在我们用同样方法给“视频源”、“冻结图像”、“解冻图像”、“退出视频”等按钮增加对应的处理代码,使他们可以实现我们预想的功能。
视频源代码:
void CVideoEncodeDlg::OnVideosource()
{
if(gCapDrvCaplgVideoSource)
}
其中它的ID是ID_VIDEOSOURCE。编辑通过,无错误的情况下,即可实现我们想要的设置视频源的功能。
点击“视频源”按钮, 会跳出“视频源”的设置窗口,通过这个窗口,我们 6
capDlgVideoSource(m_hWndVideo);
第四章 视频捕获的设计方案与实现
看到有4个大的选项,其中“设定”选项可以调整图像的亮度、对比度、色调和饱和度等参数,还可设定自动模式控制的各个参数,默认设置,室内外模式,去抖动的频率等;“特效”项设置各种特效效果;“缩放”可以放大或缩小;还可以设置“捕获源”,选择不同的摄像头(如果装有多个摄像头的话)进行视频的捕获,如下图4.5所示。
通过“视频源”设置,我们可以根据实际需要对其进行设置,最后得到我们希望可以实现的视频图像效果,这在现实的视频应用中是相当实用的。
图4.5 视频源设置
冻结图像代码:
void CVideoEncodeDlg::OnVideofraze()
{
capPreview(m_hWndVideo,FALSE);
7
第四章 视频捕获的设计方案与实现
}
点击“冻结图像”后停止实时的视频图像捕获和显示图像,仅显示当前的一幅静止图像。
解冻图像代码:
void CVideoEncodeDlg::OnVideounfraze()
{
capPreview(cameraWin,true);
}
“解冻图像”和“冻结图像”相对应,实现的功能相反,点击“解冻图像”后图像被解除冻结,恢复“实时捕获和显示图像”的功能。
4.4.2 实现单帧捕捉
在前面我们已经实现了的各项功能的基础上,现在我们添加其他的一些在现实生活中比较实用的功能进行完善,其中实现视频的单帧捕捉并且另存为一个单独的文件就是我们希望实现的一个功能之一。下面是我们如何实现这个功能的具体步骤:
与前面添加的各项基本功能的过程相类似,首先我们要添加一个“单帧捕捉”的按钮,令其ID为:ID_VIDEOONE,这个相当于一个地址,然后对这个按钮进行编辑,添加相应的代码,实现相应的功能。
8
第四章 视频捕获的设计方案与实现
4.6 单帧捕捉视频采集窗口
运行该程序时,我们得到的视频采集窗口如上图4.6所示,在前面得到的视频采集窗的基础上已经增加了一个“单帧捕捉”按钮。
在此,点击窗口中的“单帧捕捉”按钮时,跳出另存为的保存对话框,如下图4.7所示:
图4.7 BMP文件保存对话框
通过保存对话框,我们可以选择捕获到的单帧图片的保存路径,指定特定的文件夹进行保存,并且可以随意选择自己喜欢的文件名进行保存,保存类型为bmp格式。设置好后,点击“保存”按钮即可将其保存,如果点击“取消”按钮,则关闭保存对话框。
单帧捕捉的基本流程就是以上所示,过程不算复杂,只要认真编辑,细心一些,应该都是可以实现的。
4.4.3 实现视频录像方式一
下面我们讨论在视频捕捉里面最重要也是最基本的一个功能:视频的捕捉录像,并且另存为一个AVI格式的视频文件,可以随时进行调用。具体的实现步骤如下:
首先我们依然和前面实现的功能一样,先在添加两个按钮“视频录像”和 9
第四章 视频捕获的设计方案与实现
“停止录像”,得到如下图4.8所示的采集窗口,然后我们就可以编辑这两个菜单项,在这两个菜单项里面添加相应的代码,即可实现相应的功能。具体代码如下。
图4.8 视频采集录像窗口
首先我们先编辑“视频录像”菜单项,其中用到的函数主要有capFileSetCaptureFile();capCaptureSequence();以及函数capFileSaveAs()等。设置其ID为:ID_VIDEOCAPTURE。
用VC++6.0打开,运行编译该程序时,如果通过编译,点击“视频捕捉”菜单,跳出“视频压缩”格式窗口,如图4.9所示:
图4.9 压缩格式选择
在视频压缩窗口,我们可以选择使用不同的压缩程序,在此我们可以选 10
第四章 视频捕获的设计方案与实现
择的压缩程序有七种:
1.“Cinepak Codec by Radius”编码速度较慢,图象也不够清晰,一般只在电脑多媒体交互式演示文件中使用;
2.“Intel Indeo(R) Video R3.2”它压缩率比Cinepak大,但需要回放的计算机要比Cinepak的快,编码耗时,而且生成的文件比较大;
3.“Intel Indeo? Video 4.5”质量比Cinepak和R3.2要好,可以适应不同带宽的网络,但必须有相应的解码插件才能顺利地进行播放;
4.“Intel IYUV codec”所得图像质量极好,但它的生成的文件太大了;
5.“Microsoft Video 1”是一种有损压缩方案,最高仅达到256色,所以一般不使用这种压缩方式;
6.“Indeo? Video 5.10”具有压缩比例高、音频、视频质量损失小的特点,是目前应用较广泛的一种AVI编码技术;
7.“全帧(非压缩的)“不进行压缩;
在视频压缩窗口,我们可以选择使用不同的压缩程序。压缩的质量也是可以选择的,由0%至100%,视实际的情况而定,如果要求高可以选择100%质量,要求不高可以适当选择低一些。
点击“配置”按钮,跳出配置窗口如图4.10
图4.10 压缩配置窗口
在配置选择窗口可以配置两种模式。
点击“关于”按钮可看到视频压缩窗口的一些基本信息,在此不做说明。
在图4.9中点击确定,即可进入“另存为”的保存对话框,如下图4.11所示。通过这个对话框,我们可以选择保存的路径,指定保存文件的文件名,同时我们也可以看到,保存的视频文件是以AVI格式进行保存的。点击“保存(S)”按键,即可进行视频的录像并保存在指定的文件夹下,完成视频的采集功能。
11
第四章 视频捕获的设计方案与实现
图4.11 视频采集保存对话框
接着我们讨论如何退出视频的捕捉录像,编辑“停止录像”按钮,增加相应的代码,这个功能的实现比较简单,程序的源代码为:
void CVideoEncodeDlg::OnStopcapture()
{
capCaptureStop(m_hWndVideo);
capCaptureAbort(m_hWndVideo);
}
点击“停止录像”按钮,即可退出视频的捕捉。此时,在指定的文件夹将生成我们前一步启动“视频录像”时以指定的文件名保存的AVI格式的视频文件。
以上都是在使用USB2.0接口的数码驱动摄像头进行编辑程序时经常用以实现的功能,下一章我们将跳出这些功能,研究实现一些新的功能,使其实现的功能更加的丰富。
4.4.4 实现视频录像方式二
前面我们已经利用方式一进行了视频录像的设计,但是如一开始所说,它只是调用了最简单的capFileSetCaptureFile函数和capCaptureSequence函数,它的缺点很明显,就是在录像时无法响应用户界面,我们点击录像菜单进行录像后,鼠标一直处于漏斗状,不能进行停止录像等操作,直到多次点击采集窗口,才能恢复正常。为了改进这个重大的不足,我们使用另一种方式实现视频的录像,即使用注册回调函数capSetCallbackOnVideoStream的方式, 12
第四章 视频捕获的设计方案与实现
使用这种方法,可以消除前面方式一所出现的情况,录像流畅。
回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。所以回调函数非常适合在重复执行任务的情况下使用。在本设计中,当点击了录像,就可以调用回调函数。
在开发视频应用程序时,可以为视频捕捉窗口设计一些回调函数,这样,当视频应用程序的某些状态改变时,可以在回调函数中进行处理。VFW提供了如下的函数进行回调函数注册。
(1)capSetCallbackOnCapControl
该函数提供了视频捕捉时精确控制捕捉开始和结束的时间。语法如下:
BOOL capSetCallbackOnCapControl(HWND hwnd,
CAPCONTROLCALLBACK fpProc );
其中,hWnd表示视频捕捉窗口句柄,nState参数如果设置为CONTROLCALL—BACK_PREROLL,表示将要开启视频源,为CONTROLCALLBACK_CAPTURING,表示应用程序允许通过返回FALSE去结束视频捕捉。
(2)capSetCallbackOnError
该函数用于为客户端应用程序设置错误处理的回调函数。语法如下:
BOOL capSetCallbackOnError(HWND hwnd, CAPERRORCALLBACKA
fpProc);
参数说明:
其中,hWnd表示视频捕捉窗口句柄,nID表示消息ID,lpsz表示消息文本描述。
(3)capSetCallbackOnFrame
该函数用于设置预览回调函数,回调函数在预览帧之前调用。语法如下:
BOOL capSetCallbackOnFrame(HWND hwnd, CAPVIDEOCALLBACK
fpProc );
参数说明:
其中, hWnd表示视频捕捉窗口句柄,lpVHdr是一个VIDEOHDR结构指针,表示视频数据头。
(4)capSetCallbackOnStatus
该函数用于在程序中设置一个状态回调函数。语法如下:
13
第四章 视频捕获的设计方案与实现
BOOL capSetCallbackOnStatus(HWND hwnd, CAPSTATUSCALLBACKA
fpProc );
其中, hWnd表示视频捕捉窗口句柄,nID表示状态码,lpsz表示状态文本描述。
(5)capSetCallbackOnVideoStream
该函数用于注册一个回调函数,使得视频缓冲区被填充时调用回调函数。语法如下:
BOOL capSetCallbackOnVideoStream(HWND hwnd, CAPVIDEOCALLBACK
fpProc );
(6)capSetCallbackOnWaveStream
该函数用于注册一个回调函数,使得音频缓冲区被填充时调用回调函数。语法如下:
BOOL capSetCallbackOnWaveStream (HWND hwnd, CAPWAVECALLBACK
fpProc );
其中, hWnd表示视频捕捉窗口句柄,lpWHdr是一个WAVEHDR结构指针,表示音频数据头。
(7)capSetCallbackOnYield
该函数用于注册一个回调函数,使得在每一次捕捉视频帧时调用一次回调函数。语法如下:
BOOL capSetCallbackOnYield(HWND hwnd, fpProc );
其中, hWnd表示视频捕捉窗口句柄。通常,该函数由消息循环构成。
VFW的回调函数在视频预览、视频录像、视频压缩等多个地方被广泛使用。
下面我们进入具体的程序设计阶段:
(1)定义一个回调函数,该回调函数实现数据压缩,并将压缩的数据写入文件流中。
(2)调用capSetCallbackOnVideoStream注册回调函数。
(3)调用ICOpen函数打开一个压缩器,并调用ICCompressBegin函数开始压缩。
(4)调用AVIFileOpen函数打开一个AVI文件,并调用AVIFileCreateStream函数创建文件流。
14
第四章 视频捕获的设计方案与实现
(5)调用capCaptureSequenceNoFile函数开始录像。
在此我们不使用方式一的单线程方式,而是使用比较流畅的注册回调函数来实现我们的功能。最后等到的视频采集窗口效果如下图4.12所示:
图4.12 视频采集窗口
由于方式二和方式一的主要区别是在于实现录像功能的方式不同,所以我们现在也是主要讨论如何实现录像功能。
(1)创建一个基于对话框的工程,在对话框中添加按钮、图像控件等。
(2)在对话框的头文件中引用“vfw.h”头文件,并导入“vfw32.lib”库文件。
(3)向对话框类中添加成员变量。
(4)定义一个回调函数,在流捕捉时执行。
(5)在对话框初始化时开始视频预览,设置视频参数。
(6)向对话框中添加InitCompress方法,设置压缩参数信息。
(7)处理“录像”按钮的单击事件,开始视频录像。
其中最重要的是(4)和(5),由于程序太长,所以我们在此就不具体列出代码。
当我们点击视频录像的时候,同样跳出视频压缩窗口,如图4. 9.选择好压缩格式,跳出另存为保存对话框,设置好路径后点确定,即可进行视频录像并保存为AVI格式的文件。录像过程流畅,没有出现无法响应或相应缓慢的情况,到此,录像功能完成。 15
第五章 运动检测监控录像设计与实现
第五章 运动检测监控录像设计与实现
5.1 概述
运动检测是运动图像分析,可视监控,可视人机交互中的重要处理步骤,通过运动检测可以得到图像中的运动信息,提取图形中的运动任务或目标,简化了后续的运动跟踪,识别,分析的难度,具有十分重要的意义。通常采用4种方法:一是将事先准备好的背景图像与实际的图像进行差值运算,这种方法对光照,噪声比较敏感;二是基于差影方法的运动区域提取方法,这种方法很难完整地提取运动的区域;三是采用一定的方法进行背景图像的识别,这种方法对背景图像的领域知识具有较大的依赖关系;四是基于光学流的方法,这种方法效果比较好,但是计算量太大,不利于实时应用。
世界是变化的,运动图像为我们提供了比单一图像更丰富的信息。图像处理从静止图像转移到图像序列上,通过对多帧图像分析,可获得从单一图像中不可能得到的信息。只有在图像序列上我们才有可能认识和分析动态过程。运动图像分析的基本任务是从图像序列中检测出运动信息,识别与跟踪运动目标。它是图像处理与计算机视觉领域中的一个非常活跃的分支,由于在国民经济和军事领域的许多方面有着广泛的应用,对它的研究受到各国科学家的普遍关注。
5.2 基本的研究思路
在本课题中,我们研究的是比较简单的情况,不研究太过于复杂的情况,所以进行运动监测的基本思路是:首先摄像头不断地在设定的时间间隔内提取两幅图像,并且同时不断地进行相减比较,即进行图像的差值运算,如果两幅图像灰度没有任何的差值,灰度差为0,即两幅图像是一模一样的,证明没有任何物体进入摄像头的范围内,监控环境没有变化,不进行捕捉录像。反之,如果有物体进入了摄像头的摄像范围,那么捕捉到的两幅相邻图像进行相减,由于图像发生了变化,相减结果肯定不会为零,即存在一个相减后不为零的像素灰度差值,我们就可以根据差值的大小,判断究竟有没有物体进入了摄像头的摄像范围,如果差值大于某一个值,我们则认为图像内有运动物体,立即启动摄像头进行视频的录像,并且保存下来。如果差值小于某一个值,那么我们就可以认为在摄像头的摄像范围内没有发生运动物体的变 0
第五章 运动检测监控录像设计与实现
化,不进行视频录像,因为有时候由于摄像头的抖动或者是风吹动,蚊子飞过等这些都是轻微的图像变化,并没有真正发生物体的运动,这样的监控录像时没有意义的。自动监控的目的就是用于在发现异常的情况下进行自动的拍摄录像,比如说有盗贼入室盗窃,在无人看守的情况下静止物体的监控观察,发生了各种火灾等。一般都是应用于图像的变化比较大时。
在以上的监控系统中,有两个参数很重要,一是捕捉到的两幅图像的时间间隔设定,另一个参数是两幅图像进行相减后,判定是否发生了物体的运动的像素灰度差值,即临界值。一般,我们设定间隔时间为1秒,临界值则根据实际情况进行设定。
5.3 实现的步骤
在以上思路的指导下,下面我们进行实际的具体操作,并且实现相应的功能。
(1)首先和前面实现的各个功能的情况一样,我们在图4.12的基础上添加两个按钮 “开视频监控”和“关闭监控”,其ID分别为ID_OPENCHECK和ID_CLOSECHECK,得到的视频采集窗口的菜单项在包括前面的各个功能的情况下,一共就有10个按钮了,功能算是比较丰富的了。
(2)对“开视频监控”和“关闭监控”两个按钮进行编辑,添加代码,实现我们指定的功能。
编辑“开视频监控”项。在此,我们可以先给它指定一个存储的路径,在存储路径上可以自己命名文件。如上一章4.11图所示,代码也一样,在此我们就不再全部列出。
在以上的时间中断处理函数中,就涉及了到上面提到的两个重要参数中的其中一个,即采集两幅图像时的时间间隔,SetTimer(1,1000,NULL)中的1000就是这个参数,指的就是1000毫秒,即1秒。这个参数可以根据自己的实际情况需要而进行设定。设定好了之后,中断处理函数就可以在设定的时间内捕捉到两幅图像,接下来是进行图像的比较,CheckImage()语句就是使其跳转到图像相减数据比较的函数。
以上就是实现两幅图像相减的函数,相减的结果为SumDef,这就是在开始时提到的两个重要参数的另外一个,我们根据需要可以设置一个临界值,例如我们设定为100000,如果相减结果SumDef小于100000,我们认为没有发 1
第五章 运动检测监控录像设计与实现
生物体的运动变化,如果SumDef大于100000,则马上执行capCaptureSequence()函数,进行视频的录像拍摄。
图像相减使用的公式可以表示为:
SumDef320240i0fi1fi2
其中和表示fi1fi2的是图像中同一个像素点的灰度值,320*240表示的是图像的分辨率。tempi=fi1-fi2,而是两副得tempi到图像的其中第i个像素点灰度值的差,SumDef是的绝对tempi值和,即整幅图像所有像素点相减得到的灰度值的总和,根据这个总和判断两副控的基于图像处理的思想。
为了更加实用,可以编辑代码,使自动监控的时候,当图像没有发生物体的运动,录像可以自动停止。定义CapCaptureFlag和captimes。
当正在视频监控录像的时候,定时器继续工作,在此设定定时比较两次后,如果图像发生运动变化,则继续录像,如果没有发生运动变化,则自动停止录像。更加自动化和人性化,从而达到我们预定的目的。到此,“开视频监控”按钮功能基本实现。
如果程序没有出错顺利通过编译的话,运行最后得到的视频采集窗口应该如下图4.13所示:
图像的差别,大于某个值即可认为是发生了物体的运动,然后开启自动录像功能。这就是本论文中实现监 2
第五章 运动检测监控录像设计与实现
图4.13 带监控功能的视频采集对话框
运行程序,即可实现运动的检测监控。
至此,我们希望可以实现的功能已经全部完成,接下来就是测试调试,优化程序阶段。
5.4 功能的改进
在优化程序的同时,我们也希望可以对程序进行一些改进,比如上面提到的在运动检测时用到的两个重要参数:时间设置和像素灰度差值设置。由于修改时需要在程序源代码中修改,显然是十分的不方便,在现实的应用中实用性也不是很高,试想有几个人在使用的时候有能力在程序里面修改以达到自己希望的功能呢?所以,我们还要对程序进行改进,使其在采集窗口就可以修改这两个参数。即“傻瓜化”,不用掌握编程的任何东西,消费者也可以按自己的需要轻松对这两个参数进行修改。
具体的改进实施步骤:
用VC++6.0打开前面已经能够完成的程序,然后新建一个对话框,设置的样式如下图4.14.使得当点击“开视频监控”按钮时可以跳出这个参数设置对话框,对这两个参数进行设置。
3
第五章 运动检测监控录像设计与实现
图 4.14 监控参数设置对话框
在此,我们可以设置监控时间和监控灵敏度这两个参数。还有一个确定的按钮。
为了使应用程序在用户点击“确定”按钮后能改变参数,我们还需要为“确定”按钮添加一个消息处理函数,以便响应用户的操作。编辑“确定”按钮的消息处理函数。
在此,我们设定图像采集的间隔时间初始值为1000,单位为ms,即1秒。用户也可以根据实际的需要输入。
我们预设置好三档的灵敏度,低灵敏度时,像素灰度差值为200000,一般时为150000,高灵敏度时为100000,当然我们也可以根据实际需要进行修改。实际运行情况如下图所示:
1、底灵敏度时,如图4.15所示:
4
第五章 运动检测监控录像设计与实现
(a) (b)
图4.15 底灵敏度时
如图监控内发生了明显的物体运动,(b)比(a)多了两个手指,变化很大,摄像头检测到后,即马上进行录像。而如果发生的变化比较小,比如远远的有一个人进入或是小小的一根筷子而已,变化不是非常大,SumDef没有达到预设值的值,则不会进行录像。
2、灵敏度一般的时候,如图4.16所示:
(a) (b)
图4.16 一般灵敏度时
一般灵敏度时以人为例,这在实际生活中也是比较实用的。(a)图里面没有人,而(b)图多了一个人进入了图像里面,检测到后,同理马上也进行录像并保存,就可以实现物体的运动检测了。但是如果是(b)图仅仅比(a)图多了一根小小的筷子而已,则由于变化太小,摄像头检测不出变化,所以将不会自动进行录像。
3、高灵敏度时,如图4.17所示:
(a)
5
(b)图4.7
第五章 运动检测监控录像设计与实现
图4.17 高灵敏度时
在高灵敏度的时候,发生了比较轻微的变化的将激活录像功能,比如图4.7里面,(b)图比(a)图多了一个筷子,这个变化不是很大,但是还是能检测到,并且监控录像。
在此监控功能中,开启监控后,摄像头并是一直录像,只有当发生了物体的运动变化并检测到后,才开始录像,这样可以节省资源,也可以减少运算量。至此,视频运动监控功能的改进完成了。
5.5 总结
在视频监控中,使用图像处理来实现的研究还是比较少的,本文就这一技术运用于视频的运动监控做了初步的研究。
在程序的编译过程中,难免会由于各种各样的原因,导致编译出错,但是只要耐心,方法得当,慢慢检查,慢慢测试,总是可以发现出错的原因,并且加以改正,最后实现编译通过,实现功能。
6
致谢
第六章 论文总结与展望
6.1 课题完成情况
在本课题的研究过程中,本人收集、查阅了大量与课题有关的资料,了解了与视频捕获从硬件方面到软件方面的一些相关技术。其中主要研究了基于Windows操作系统平台下软件实现视频捕捉技术VFW。通过分析VFW的技术架构、视频捕获模块AVICap类的实现机制,给出了利用VFW技术实现视频捕获及视频运动图像监控的一般方法及流程。达到了预期的目的。
6.2 主要的研究成果
本文主要研究了关于视频方面的内容,包括捕捉视频和在视频监控的条件下实现运动的检测。根据本课题系统的特点,建立了基于普通USB2.0数字摄像头的、采用电脑作为检测实验平台,设计编程,取得良好的效果,并采用本系统进行了运动物体检测的实验研究,实验结果表明本课题研究的图像检测系统是能够满足实际需要的。本课题取得的主要研究成果如下:
(1)熟悉使用了Visual C++6.0开发工具,通过此次的毕业设计,掌握此种开发软件,了解了整个的程序开发流程,对自己以后的工作大有好处。
(2)研究了Windows下的基于VFW的视频捕捉技术,建立了基于普通USB2.0接口的数字摄像头图像检测平台,为今后对视频技术的研究打下了一个良好的基础。
(3)探讨研究了运动图像的目标追踪方法,实现了运动物体的自动监控,在实际是生活工作中是很有意义的,可以实现在无人监控的情况下自动录像的功能。
(4)通过设计本系统,运用并复习了C和C++语言的知识,进一步巩固了所学的知识。
6.3 存在的不足
基于数字图像的检测技术是一项很有发展前途的技术,出于时间的限制及各种原因的影响,经过了自己的一番努力,虽然基本的功能都已经可以实现了,但是还是有一些不足之处,需要进一步的研究并加以改进的有:
1.
如视频捕获的用户界面还不够美观,相对较为粗糙,对有些潜在的可能49
致谢
发生的不合理条件分析的还不够到位。
2.
3.
在捕获视频时,无法控制捕获速率。
本课题实现的功能只是关于视频方面,音频方面并没有考虑,在此也不能捕捉,所以下一步是研究如何实现视频音频的同时捕捉,并且能使其同步播放。
4. 在系统的视频图像捕捉技术方面由于采用VFW技术,虽然使用相对较容易,但也存在不够灵活,难以更深入控制等缺点,所以我们可以考虑采用DirectShow。
5.
6.
在捕捉视频的时候,有时采集窗口出现假死现象,即窗口卡在一幅图像上,必须等缓冲一下才可以正常实现视频的录像,这是必须改进的。
视频图像的采集与图像转换运行速度较慢,在某些场合响应不及时,这也需要进一步的改进。
6.4 工作展望
利用USB2.0数码摄像头,使用图像处理技术进行视频的捕获,然后实现运动物体识别监控的研究现状还是处于开始阶段。实现生活中经常使用的还是使用CCD的摄像头,但是它有许多缺点,技术复杂,安装麻烦,远远没有利用USB2.0数码摄像头简单易行,即插即用。可以预见,利用一般的数码摄像头进行视频监控在未来必将成为一种趋势。
49
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690332762a334001.html
评论列表(0条)