摘要
本文旨在通过VC++60开发平台开发一个基于OpenCV的视频播放器。 OpenCV是计算机视觉库基于O p e n CV的视频播放器可以更简单的实现AV I视频的播放。
首先本文简单介绍了VC++60软件开发平台 OpenCV计算机视觉库的特点和应用领域计算机视频技术的发展 以及各种视频格式的分类等其次选择在微软的Microsoft Visual Studio 60开发平台上使用C++语言进行开发编写出基于OpenCV的功能简单实用方便的视频播放器。主要包括以下几个方面开发本软件所使用的开发平台与技术功能模块功能设计功能实现等。
关键词 Microsoft Visual Studio 60 OpenCV C++视频播放器 AVI格式
Abstract
This paper aims to develop a VC + + 60 development platform based on the videoplayer OpenCV,OpenCV is based on computer vision, the video player can OpenCVmoresimple real ization video playback AVI
Firstly, the paper simply introduces vc + + 60 software development platform underOpenCV, computer vision, the characteristics and appl ication fields of the l ibrary,computervideo technology development, aswel l asvariousvideo format of classification,Second choice at Microsoft MicrosoftVisual Studio 60 development platform using c++language development, and write a simple and practical OpenCV based on the functionof video player convenience Mainly includes the fol lowing aspects: the development ofthe software development platform and technology of use, Function module, Functionaldesign, Functions,etc
Keywords:Microsoft Visual Studio 60;OpenCV;C++;Video Player;AVI format
目录
1 绪论. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
1.1 概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
1.2 OPENCV简介. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2
1.2.1 OpenCV. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2
1.2.2 OpenCV的应用领域. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
1.2.3 计算机视觉. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
1.3 论文主要研究内容及研究意义. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
1.4 论文组织结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
2 视频技术概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
2.1 多媒体技术. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
2.2 视频格式及视频流播放回放. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
2.2.1 视频格式分类. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
2.2.2视频流播放与回放. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
3 OPENCV库使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18
3.1 在VC下安装OPENCV. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18
4 VC开发环境. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
4.1 VC++的组件工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
4.1.1编译器工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
4.1.2 VC++库. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
4.1.3 VC++开发环境. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
5 视频播放器的设计与实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
5.1 模块划分. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
5.1.1播放器功能模块图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
5.2 详细设计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
5.2.1 主界面的实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
5.2.2 文件控制的实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29
5.2.3 播放控制的实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31
5.2.4 进度控制的实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34
5.2.5 系统声明. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
6 程序运行结果及分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
6.1 运行结果测试. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
6.2 结果分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
结 论. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
致 谢. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
参考文献. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
附录A英文原文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42
附录B 中文翻译. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
附录C程序源代码. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55
1绪论
1.1概述
C++语言是一种优秀的面向对象程序设计语言 它在C语言的基础上发展而来但它比C语言更容易为人们学习和掌握。 C++以其独特的语言机制在计算机科学的各个领域中得到了广泛的应用。面向对象的设计思想是在原来结构化程序设计方法基础上的一个质的飞跃 C++完美地体现了面向对象的各种特性。 [1]
C++程序设计语言是由来自AT&T Bel l Laboratories的Bjarne Stroustrup设计和实现的 它兼具Simula语言在组织与设计方面的特性以及适用于系统程序设计的C语言设施。 C++最初的版本被称作“带类的C C with classes ”[Stroustrup,1980] 在1980年被第一次投入使用 当时它只支持系统程序设计和数据抽象技术。支持面向对象程序设计的语言设施在1983年被加入C++之后面向对象设计方法和面向对象程序设计技术就逐渐进入了C++领域。在1985年 C++第一次投入商业市场。在1987至1989年间支持范型程序设计的语言设施也被加进了C++。 [2]
随着若干独立开发的C++实现产品的出现和广泛应用正式的C++标准化工作在1990年启动。标准化工作由ANSI American National Standard Institute 以及后来加入的ISO International Standards Organization负责。 1998年正式发布了C++语言的国际标准[C++,1998]。
而VC是基于C C++语言主要由是MFC组成是与系统联系非常紧密的编程工具 它兼有高级和低级语言的双重性功能强大灵活执行效率高几乎可说VC在Windows平台无所不能。 [3]
AVI Audio Video Interleave是一种音频视像交插记录的数字视频文件格式。1992年初Microsoft公司推出了AVI技术及其应用软件VFWVideo for Windows 。在AV I文件中运动图像和伴音数据是以交织的方式存储 并独立于硬件设备。这种按交替方式组织音频和视像数据的方式可使得读取视频数据流时能更有效地从存储媒介得到连续的信息。 AVI可以算是Windows操作系统上最基本的也是最常用的一种媒体文件格式 兼容性比较好。构成一个AV I文件的主要参数包括视像参数、伴音参数和压缩参数等。
OpenCV是Intel公司支持的开源计算机视觉库。它轻量级而且高效——由一系列
C函数和少量C++类构成 实现了图像处理和计算机视觉方面的很多通用算法。
计算机视觉市场巨大而且持续增长且这方面没有标准API 目前的计算机视觉软件大概有以下三种
1研究代码慢不稳定独立并与其他库布兼容
2耗费很高的商业化工具比如Halcon,MATLAB+Simul ink
3依赖硬件的一些特别的解决方案比如视频监控制造控制系统 医疗设备
这是目前的现状。而标准的API将简化计算机视觉程序和解决方案的开发。OpenCV致力于成为这样的标准API。
本文在此基础上设计一个基于OpenCV的视频播放器可以更简捷的实现avi格式视频文件的播放暂停停止等操作。
1.2 OPENCV简介
121 OpenCV
OpenCV是Intel资助的开源计算机视觉库。它由一系列C函数和少量C++类构成实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV拥有包括300多个C/C++函数的跨平台的中、高层API。它不依赖与其它的外部库尽管也可以使用某些外部库。
OpenCV对非商业应用和商业应用都是免费的。另外OpenCV也为Intel公司的Integrated Performance Primitives (IPP)提供了透明接口。 这意味着如果有为特定处理器INTEL的处理器优化的的IPP库 OpenCV将在运行时自动加载这些库。
OpenCV的一个目标是构建一个简单易用的计算机视觉框架 以帮助开发人员更便捷地设计更复杂的计算机视觉相关应用程序。 OpenCV包含的函数有500多个覆盖了计算机视觉的许多应用领域 如工厂产品检测、医学成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等。 因为计算机视觉和机器学习密切相关所以OpenCV还提供了MLL(Machine Learning Library)机器学习库。该机器学习库侧重于统计方面的模式识别和聚类(clustering)。 MLL除了用在视觉相关的任务中还可以方便地应用于其他的机器学习场合。
开发OpenCV的目的是为了促进CPU密集型应用。为了达到这一目的 Intel启动
了多个项目包括实时光线追踪和三维显示墙。一个在Intel工作的OpenCV作者在访问一些大学时注意到许多顶尖大学中的研究组(如MIT媒体实验室)拥有很好的内部使用的开放计算机视觉库——(在学生们之间互相传播的代码)这会帮助一个新生从高的起点开始他/她的计算机视觉研究。这样一个新生可以在以前的基础上继续开始研究而不用从底层写基本函数。
因此 OpenCV的目的是开发一个普遍可用的计算机视觉库。在Intel的性能库团队的帮助下 OpenCV实现了一些核心代码以及算法 并发给Intel俄罗斯的库团队。这就是OpenCV的诞生之地在与软件性能库团队的合作下 它开始于Intel的研究中心 并在俄罗斯得到实现和优化。
122 OpenCV的应用领域
大多数计算机科学家和程序员已经意识到计算机视觉的重要作用。但是很少有人知道计算机视觉的所有应用。例如大多数人或多或少地知道计算机视觉可用在监控方面也知道视觉被越来越多地用在网络图像和视频方面。少数人也了解计算机视觉在游戏界面方面的应用。但是很少有人了解大多数航空和街道地图图像(如Google的Street View)也大量使用计算机定标和图像拼接技术。一些人知道安全监控、无人飞行器或生物医学分析等方面的应用但是很少人知道机器视觉是多么广泛地被用在工厂中差不多所有的大规模制造的产品都在流水线上的某个环节上自动使用视觉检测。
OpenCV所有的开放源代码协议允许用户使用OpenCV的全部代码或者OpenCV的部分代码生成商业产品。使用了OpenCV后 用户不必对公众开放自己的源代码或改善后的算法 虽然Intel公司非常希望用户能够开放源代码。许多公司(IBM Microsoft SONY Siemens和Google等其他公司)和研究单位(例如斯坦福大学、 MIT、 CMU、剑桥大学和INRIA)中的人都广泛使用OpenCV 其部分原因是OpenCV采用了这个宽松的协议。 Yahoo groups里有一个OpenCV论坛() 用户可以在此发帖提问和讨论该论坛大约有20000个会员。 OpenCV在全世界广受欢迎在中国、 日本、俄罗斯、欧洲和以色列都有庞大的用户群。
自从OpenCV在1999年1月发布alpha版本开始 它就被广泛用在许多应用领域、产品和研究成果中。相关应用包括卫星地图和电子地图的拼接 扫描图像的对齐 医学图像去噪(消噪或滤波) 图像中的物体分析安全和入侵检测系统 自动监视和安全
系统 制造业中的产品质量检测系统摄像机标定军事应用 无人飞行器 无人汽车和无人水下机器人。将视觉识别技术用在声谱图上 OpenCV可以进行声音和音乐识别。在斯坦福大学的Stanley机器人项目中 OpenCV是其视觉系统的关键部分。Stanley在DARPA机器人沙漠挑战赛中赢得了二百万美元奖金[Thrun06]。 [4]
123计算机视觉
计算机视觉是将来自静止图像或视频的数据转换成一个决策或者一种新的表达方式的过程所有的这些转换都是为了达到某个目标。输入数据可以包含一些辅助信息如“摄像机架在汽车上”或“激光扫描仪在1米处发现一个物体”。最终的决策可能是“场景中有一个人”或“在这个切片中有14个肿瘤细胞”。一种新的表达方式可以是将一张彩色照片转为灰度照片或者从图像序列中去除摄像机晃动影响。
因为人类是视觉动物所以会误以为可以很容易地实现计算机视觉。 当人们凝视图像时就会很容易从中找到一辆汽车。人们凭直觉会觉得很容易。人脑将视觉信号划分入很多个通道将各种不同的信息输入了大脑。大脑有一个关注系统会根据任务识别出图像的重要部分 并做重点分析而其他部分则分析得较少。在人类视觉流中存在大量的反馈但是目前我们对之了解甚少。肌肉控制的传感器以及其他所有传感器的输入信息之间存在广泛的关联这使得大脑可以依赖从出生以来所学到的信息。大脑中的反馈在信息处理的各个阶段都存在在传感器硬件(眼睛)中也存在。在眼睛中通过反馈来调节通过瞳孔的进光量 以及调节视网膜表面上的接收单元。
在计算机视觉系统中计算机接接收到的是来自摄像机或者磁盘文件的一个数值矩阵。一般来说没有内置的模式识别系统没有自动控制的对焦和光圈没有多年来经验的积累。视觉系统通常很低级。
实际上计算机视觉问题比前面我们提到的更糟糕 它是不可解的。给出三维世界的二维视图是没有固定方法来重建出三维信息的。在理论上此类病态问题没有惟一和确定的解。即使数据很完美 同一张二维图像也可以表示多种三维场景。然而如前面提到的数据会被噪声和形变影响。这些影响来自真实世界的变化(天气、光线、反射、运动)镜头和机械结构的不完美传感器上的长时间感应(运动模糊)传感器上和其他电子器件上的电子噪声 以及图像采集后的图像压缩引入的变化。都是很令人头疼的问题。
设计实际系统时 为了克服视觉传感器的限制通常会使用一些其他的上下文知识。考虑这样一个例子移动机器人在室内寻找并捡起订书机。机器人可以利用这个先验知识可在办公室内发现桌子订书机最可能在桌子上被找到。这给出了一个隐含的尺寸参考或参照也就是订书机能够放在桌子上。这也可以用于消除在不可能的地方(例如在天花板或者窗户上)错误识别出订书机的可能性。机器人也完全可以忽略一个200英尺大小的跟订书机形状类似的广告飞艇 因为飞艇周围没有桌子的木纹背景。与之相反在图像检索中数据库中的所有订书机图像都是对真正的订书机拍摄的而且尺寸很大和形状不规划的订书机图像一般不可能被拍到。也就是拍摄者一般只拍摄真正的、普通大小的订书机图像。而且人们拍照时一般会将被拍物体置于中心且将物体放在最能表现其特征的方向上。 因此在由人拍摄的图像中具有相当多的隐含信息。 [5]
人们也可以使用机器学习技术对上下文信息进行显式建模。隐含的变量(例如物体大小、重力方向及其他变量)都可以通过标记好的训练数据里的数值来校正。或者也可以通过其他的传感器来测量隐含的变量。使用激光扫描仪可以精确测量出一个物体的大小。计算机视觉面临的另一个难题是噪声问题。我们一般使用统计的方法来克服噪声。例如一般来说不可能通过比较一个点和它紧密相邻的点来检测图像里的边缘。但是如果观察一个局部区域的统计特征边缘检测会变得容易些。 由局部区域卷积的响应连成的点串构成边缘。另外可以通过时间维度上的统计来抑制噪声。还有一些其他的技术可以从数据中学习显式模型来解决噪声和畸变问题。例如镜头畸变可以通过学习一个简单多项式模型的参数来描述这种畸变然后可以几乎完全校正这种畸变。
计算机视觉拟根据摄像机数据来采取行动或者做出决策这样的行动或决策是在一个指特定目的或任务的环境中来解决。我们从图像去除噪声和损坏区域可以让监控系统在有人爬过栅栏时给出报警或者在一个游乐园里监控系统能够数出总共有多少人通过了某个区域。在办公室巡游的机器人的视觉软件所采用的方法与固定摄像机的不同 因为这两个系统有不同的应用环境和目标。通用的规律是对计算机视觉应用环境的约束越多则越能够使用这些约束来简化问题从而使最终的解决方案越可靠。 [6]
OpenCV的目标是为解决计算机视觉问题提供基本工具。在有些情况下 它提供的高层函数可以高效地解决计算机视觉中的一些很复杂的问题。 当没有高层函数时
官方网站:https://www.shuhost.com/公司名:LucidaCloud Limited尊敬的新老客户:艰难的2021年即将结束,年终辞旧迎新之际,我们准备了持续优惠、及首月优惠,为中小企业及个人客户降低IT业务成本。我们将持续努力提供给客户更好的品质与服务,在新的一年期待与您有美好的合作。# 下列价钱首月八折优惠码: 20211280OFF (每客户限用1次) * 自助购买可复制...
CloudCone在月初发了个邮件,表示上新了一个系列VPS主机,采用SSD缓存磁盘,支持下单购买额外的CPU、内存和硬盘资源,最低年付17.99美元起。CloudCone成立于2017年,提供VPS和独立服务器租用,深耕洛杉矶MC机房,最初提供按小时计费随时退回,给自己弄回一大堆中国不能访问的IP,现在已经取消了随时删除了,不过他的VPS主机价格不贵,支持购买额外IP,还支持购买高防IP。下面列...
TMThosting发布了今年黑色星期五的促销活动,即日起到12月6日,VPS主机最低55折起,独立服务器9折起,开设在西雅图机房。这是一家成立于2018年的国外主机商,主要提供VPS和独立服务器租用业务,数据中心包括美国西雅图和达拉斯,其中VPS基于KVM架构,都有提供免费的DDoS保护,支持选择Windows或者Linux操作系统。Budget HDD系列架构CPU内存硬盘流量系统价格单核51...