OpenCV入门基础教育材料.doc

上传人:一*** 文档编号:2741572 上传时间:2020-05-02 格式:DOC 页数:53 大小:8.48MB
返回 下载 相关 举报
OpenCV入门基础教育材料.doc_第1页
第1页 / 共53页
OpenCV入门基础教育材料.doc_第2页
第2页 / 共53页
点击查看更多>>
资源描述

《OpenCV入门基础教育材料.doc》由会员分享,可在线阅读,更多相关《OpenCV入门基础教育材料.doc(53页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-+ OpenCV 入门教程 作者:于仕琪 http:/ 2012年8月 版权所有 于仕琪 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。 前 言 OpenCV 是一个广受欢迎的开源计算机视觉库,它提供了很多函数,实现了很多计算机视觉算法,算法从最基本的滤波到高级的物体检测皆有涵盖。很多初学者希望快速掌握 OpenCV 的使用方法,但往往会遇到各种各样的困难。其实仔细分析,造成这些困难的原因有两类:第一类是 C/C+编程基础不过关;第二类是不了解算法原理。解决这些困难无非提升编程能力,以及提升理论基础知识。提升编程能力需要多练习编程,提升理论知识需要系统学习数字图像处理

2、、计算机视觉和模式识别等课程,所有这些都不能一蹴而就,需要耐下心来认真修炼。 同时我们也需要认识到 OpenCV 只是一个算法库,能为我们搭建计算机视觉应用提供“砖头”。我们并不需要完全精通了算法原理之后才去使用 OpenCV,只要了解了“砖头”的功能,就可以动手了。在实践中学习才是最高效的学习方式。本小册子希望为初学者提供引导,使初学者快速了解 OpenCV 的基本数据结构以及用法。 此外,如您发现有错误之处,欢迎来信指正。 于仕琪 深圳大学 插播广告:欢迎有能力、有激情以及对计算机视觉有兴趣的同学报考我的研究生。欲了解详情可以访问深圳大学招生网 http:/ 或者给我发email。 目录

3、第 1 章 预备知识 . 5 1.1 编程的流程. 5 1.2 什么叫编辑. 6 1.3 什么叫编译. 6 1.4 什么叫连接. 7 1.5 什么叫运行. 7 1.6 Visual C+是什么 . 8 1.7 头文件. 9 1.8 库文件. 10 1.9 OpenCV 是什么 . 11 1.10 什么是命令行参数. 12 1.11 常见编译错误. 13 1.11.1 找不到头文件 . 13 1.11.2 拼写错误 . 14 1.12 常见链接错误. 15 1.13 运行时错误. 17 第 2 章 OpenCV 介绍 . 19 2.1 OpenCV 的来源 . 19 2.2 OpenCV 的协议

4、 . 19 第 3 章 图像的基本操作 . 21 3.1 图像的表示. 21 3.2 Mat 类 . 23 3.3 创建 Mat 对象 . 24 3.3.1 构造函数方法 . 24 3.3.2 create()函数创建对象 . 25 3.3.3 Matlab 风格的创建对象方法 . 26 3.4 矩阵的基本元素表达. 26 3.5 像素值的读写. 27 3.5.1 at()函数 . 28 3.5.2 使用迭代器 . 29 3.5.3 通过数据指针 . 30 3.6 选取图像局部区域. 32 3.6.1 单行或单列选择 . 32 3.6.2 用 Range 选择多行或多列 . 33 3.6.3

5、感兴趣区域 . 33 3.6.4 取对角线元素 . 34 3.7 Mat 表达式 . 34 3.8 Mat_类 . 36 3.9 Mat 类的内存管理 . 38 3.10 输出. 40 3.11 Mat 与 IplImage 和 CvMat 的转换 . 42 3.11.1 Mat 转为 IplImage 和 CvMat 格式 . 42 3.11.2 IplImage 和 CvMat 格式转为 Mat . 42 第 4 章 数据获取与存储 . 44 4.1 读写图像文件. 44 4.1.1 读图像文件 . 44 4.1.2 写图像文件 . 45 4.2 读写视频. 47 4.2.1 读视频 .

6、47 4.2.2 写视频 . 49 第1章 预备知识 OpenCV 是一个功能强大的计算机视觉库,要用好它,除了要具有相关的计算机视觉理论知识外,还需要具有一定的编程能力。本书作者通过对 OpenCV 中文论坛中的大量问题观察,发现有很大比例的问题是因为用户对 C/C+语言不熟练,导致出错,或出错后不知如何解决。如果对 C/C+语言不熟悉,那使用 OpenCV 时会满头雾水瞎摸索,费心费力。 在这一章中,将介绍一些编程的基本概念,让读者对编程的流程有一个基本了解。这样在出现错误时,可以快速确定错误的类型,并知道该如何解决。 1.1 编程的流程 一个编程的基本流程包括编辑、编译和连接三大步骤。其

7、流程图如图 1.1 所示。 编辑 编译 a.cpp a.obj opencv_core.lib 编辑 编译 b.cpp b.obj 连接 main.exe 图 1.1 编程的基本流程 1.2 什么叫编辑 编辑(edit)代码即编写代码,是编程的第一步。你可以任意一个编辑器进行代码的编写。你可以使用 Windows 自带的“记事本”来编写代码,也可以使用Notepad+,或者 Visual Studio 提供的编辑器。 图 1.2 使用 Windows 自带的记事本编辑代码 虽然可以使用记事本软件编辑代码,但是记事本软件的功能非常有限。缺少常用的语法高亮,自动缩进等功能。所以可以使用其他功能更丰

8、富的编辑器,如Notepad+(图 1.3)等。 图 1.3 使用 Notepad+软件编辑代码 1.3 什么叫编译 编译(compile)是将用某种编程语言(如 C+语言)写成的源代码,转换成目标文件。目标文件包含着机器代码(可直接被计算机中央处理器执行)以及代码在运行时使用的数据。编译器(compiler)是实现这一目的的软件。编译器有很多,如在 Windows 下有微软公司的 cl.exe,在 Linux 下有 gcc 和 g+。在命令行下使用 cl.exe 对 hello.cpp 源代码进行编译,如图 1.4 所示。编译后,将得到目标文件 hello.obj,如图 1.5 所示。 图

9、1.4 在命令行下使用 cl.exe 对 hello.cpp 进行编译 图 1.5 编译后,将新生成 hello.obj 目标文件 1.4 什么叫连接 连接(link)是将多个目标文件,以及库文件生成可执行的文件(或静态库、或动态库)的过程。连接器(linker)是实现这一目的的软件。常用的连接器有Windows 下的 link.exe,Linux 下的 ld 等。 在 Windows 下可以使用 link.exe 将前面生成的 hello.obj 连接为可执行文件。在命令行下效果如所图 1.6 示。连接后,将生成可执行文件,如图 1.7 所示。 图 1.6 在命令行下使用 link.exe

10、对 hello.obj 进行连接 图 1.7 连接后,将新生成 hello.exe 可执行文件 1.5 什么叫运行 运行(run)较容易理解,我们在 Windows 资源管理器里用鼠标双击 exe 可执行程序,可以使程序被载入 CPU 运行。我们也可以在命令行窗口中输入可执行程序的文件名运行,如图 1.8 所示。 图 1.8 在命令行窗口中运行 hello.exe,可以看到程序打印到标准输出的结果。 1.6 Visual C+是什么 通过前面的介绍,可以看到一个编程的流程:编辑-编译-连接-运行。更具体来说,完成这个流程需要你: 1. 打开记事本软件,编辑代码,并保存; 2. 在命令行下运行编

11、译器,对代码进行编译,生成目标文件; 3. 在命令行下运行连接器,将目标文件连接起来,生成可执行程序; 4. 在命令行下,或 Windows 资源管理器中运行程序,验证程序的正确性。 如果你的项目只有一个源代码文件,完成上面四个步骤尚可接受。但是如果你的项目包括几十个甚至几百个源文件,如无其他软件辅助,只用上面四个非常基本的步骤进行编程开发,会让人抓狂。 集成开发环境(Integrated Development Environment,简称 IDE)可以帮助你对项目进行管理。常用的 IDE 有微软公司的 Visual Studio,里面包含 Visual C+, Visual C#等,其他的

12、还有 Eclipse、NetBeans、Delphi 等。因此我们平时所说的 VC 不是一种编程语言,也不是编译器,它只是一个 IDE。 IDE 一般包含编辑器。IDE 自带的编辑器一般都针对编程语言进行了定制,实现语法高亮、自动缩进、自动补全等方便的功能。IDE 还提供丰富的菜单和按钮工具,如图 1.9、图 1.10 和图 1.11 所示。 如果你点击 IDE 中的“生成(build)”按钮(图 1.11),或者点击菜单“生成(build)”中的菜单项“生成项目(build project)”,那么 IDE 会去调用编译器 cl.exe 和连接器 link.exe 来生成可执行程序。如果你在

13、调试状态下,还会去调用调试器(debugger)。IDE 会提升程序开发的效率,特别是调试程序的效率。 图 1.9 微软 Visual Stdio 集成开发环境 图 1.10 Visual Stdio 中的编辑按钮 图 1.11 Visual Stdio 中的生成程序按钮 1.7 头文件 在编程过程中,程序代码往往被拆成很多部分,每部分放在一个独立的源文件中,而不是将所有的代码放在一个源文件中。考虑一个简单的小例子:程序中有两个函数 main()和 foo()。main()函数位于 main.cpp,foo()函数位于 foo.cpp, main()函数中调用 foo()函数。在编译阶段,由于

14、编译是对单个文件进行编译,所以编译 main.cpp 时,编译器不知道是否存在 foo()函数以及 foo()调用是否正确,因此需要头文件辅助。也就是说,在编译命令: cl.exe /c main.cpp 运行时,编译器不知道 foo 的用法是否正确(因为 foo 在另一个文件 foo.cpp 中),只有借助头文件中的函数声明来判断。对 main.cpp 进行编译时,不会涉及 foo.cpp 文件,只会涉及 main.cpp 和 foo.h(因为 foo.h 被 include)文件。头文件的作用如图 1.1 所示。 #include foo.h int main() int i=foo(3,

15、4); return i; . foo()1函数 这样用对 main.cpp #include foo.h int foo(int i, int j) int foo(int i, int j); 2. 函数声明是int foo(int i, int j),你的 调用看上去是对的。 foo.h foo.cpp 图 1.12 对 main.cpp 进行编译时,需要利用头文件中的 foo()函数声明来确认 main.cpp 中对 foo()的调用是正确的 1.8 库文件 库文件中包含一系列的子程序。例如在上一节的例子中,foo.cpp 源文件中实现了 foo()函数,我们假设 foo()函数是包含

16、重要算法的函数,我们需要将 foo() 函数提供给客户使用,但是不希望客户看到算法源代码。为了达到这一目的,我们可以将 foo.cpp 编译程库文件(图 1.13),库文件是二进制的,在库文件中是看不到原始的源代码的。库和可执行文件的区别是,库不是独立程序,他们是向其他程序提供服务的代码。 当然使用库文件的好处不仅仅是对源代码进行保密,使用库文件还可以减少重复编译的时间,增强程序的模块化。将库文件连接到程序中,有两种方式,一种是静态连接库,另一种是动态连接库。如果希望了解更多关于库文件的知识,请查阅相关资料,再次不详细分析它们之间的异同。 编辑 main.cpp 编译 foo.lib main

17、.obj main.exe 连接 编辑 foo.cpp 编译 foo.obj 用户 开发者 图 1.13 库是二进制的文件,里面包含一系列子程序(图有问题) 1.9 OpenCV 是什么 OpenCV 其实就是一堆 C 和 C+语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。例如 C 接口函数 cvCanny()实现了 Canny 边缘提取算法。可以直接将这些源代码添加到我们自己的软件项目中,而不需要自己再去写代码实现 Canny 算法,也就是不需要重复“造轮子”。 由于 OpenCV 中源代码文件巨多,根据算法的功能,将这些源文件分到多个模块中:core、imgproc、h

18、ighgui 等。将每个模块中的源文件编译成一个库文件(如 opencv_core.lib、opencv_imgproc.lib、opencv_highgui.lib 等),用户在使用时,仅将所需的库文件添加到自己的项目中,与自己的源文件一起连接成可执行程序则可。 1.10 什么是命令行参数 C/C+语言中的 main 函数,经常带有参数 argc,argv,如下: int main(int argc, char* argv) 或者 int main(int argc, char* argv) 在上面代码中,argc 表示命令行输入参数的个数(以空白符分隔),argv 中存储了所有的命令行参数

19、。假如你的程序是 hello.exe,如果在命令行运行该程序(如图 1.14。首先应该在命令行下用 cd 命令进入到 hello.exe 文件所在目录),运行命令为: hello.exe Shiqi Yu 那么,argc 的值是 3,argv0是hello.exe,argv1是Shiqi,argv2是Yu。 图 1.14 使用命令行参数运行程序 下面的程序演示 argc 和 argv 的使用: #include int main(int argc, char * argv) int i; for (i=0; i hello.obj : error LNK2019: unresolved ext

20、ernal symbol class cv:Mat _cdecl cv:imread(class std:basic_stringchar,struct std:char_traits,class std:allocator const &,int) ( ?imreadcvYA?AVMat1ABV?$basic_stringDU?$char_traitsDstdV?$allocatorD2stdHZ) referenced in function _main 这个错误信息里最关键的词是“unresolved external symbol”,更具体的意思是在 main 函数中使用了 imrea

21、d 函数,但是无法从外部找到 imread。imread 函数是 OpenCV 的函数,不是用户自己实现的函数。opencv.hpp 头文件告诉编译器有个 imread 函数可以用,编译通过;但是到了连接时,连接器却找不到 imread 的具体实现,故出错。 图 1.17 连接错误,无法找到 imread 等函数的实现 要解决这一问题,需要将依赖的库文件添加到项目设置中。具体位置在对话框“Linker - Input”里面的“Additional Dependencies”中,如图 1.18 所示。 图 1.18 添加依赖的库文件 1.13 运行时错误 经过编译和连接过程,生成了可执行的文件(

22、如 exe 文件)之后,在运行这个可执行文件所产生的错误是运行时错误。比较常见的运行时错误是内存错误。比如下面这段代码: #include #include using namespace cv; int main() printf(Hello, OpenCV!n); Mat img = imread(lena.jpg); Mat gray; cv:cvtColor(img, gray, CV_BGR2GRAY); return 0; 编译和连接过程无任何问题,但在运行时弹出如图 1.19 所示对话框,并在命令行窗口输出错误信息(图 1.20)。 图 1.19 运行时错误对话框 图 1.20

23、运行时错误的出错信息 错误信息中提示 color.cpp 文件的第 2834 行有错,错误原因是条件 (scn=3|scn=4)不成立。很多 OpenCV 用户看到此错误信息一头雾水,不知如何下手解决。根据程序源代码的意思,是将三通道的 BGR 图像 img 转为单通道的图像 gray。但是程序说 img 既不是 3 通道,也不是 4 通道。而根据 imread 函数的文档,imread 将图像作为彩色图像读入,条件(scn=3|scn=4)肯定成立。 这个程序的问题出现在当前目录下无 lena.jpg 文件,这样程序无法读到图像,造成 cvtColor 函数出错。因此对于读入图像时,需要检查

24、图像读入是否成功,以免造成运行时错误。 在程序编写中,对于数组和指针等,要特别地小心。因为对于空指针以及数组越界等问题,编译器无法在编译时给出错误提示。这类错误一旦在运行时发生,排除起来非常困难。 第2章 OpenCV 介绍 OpenCV 的全称是 Open Source Computer Vision Library,是一个开放源代码的计算机视觉库。OpenCV 是最初由英特尔公司发起并开发,以 BSD 许可证授权发行,可以在商业和研究领域中免费使用,现在美国 Willow Garage 为 OpenCV 提供主要的支持。OpenCV 可用于开发实时的图像处理、计算机视觉以及模式识别程序,目

25、前在工业界以及科研领域广泛采用。 2.1 OpenCV 的来源 OpenCV 诞生于 Intel。Intel 最初希望提供一个计算机视觉库,使之能充分发掘 CPU 的计算能力,当然更希望以此促进 Intel 的产品的销售。OpenCV 最初的开发工作是由 Intel 在俄罗斯的团队实现。这里面有两个关键人物,一个是 Intel 性能团队(Intels Performance Library Team)的李信弘(Shinn Lee)先生,他是团队的经理,负责 IPP 等库,给予 OpenCV 很大的支持。另一个关键人物是 Vadim Pisarevsky,Vadim 在 Intel 负责 Ope

26、nCV 的项目管理、代码集成、代码优化等工作。在后期 Intel 支持渐少的时候,是 Vadim Pisarevsky 一直在维护着 OpenCV。 2007 年 6 月,受本书作者之邀,李信弘和 Vadim Pisarevsky 作为嘉宾参加了在北京举行的“开放源代码计算机视觉库(OpenCV)研讨会” 研讨会网址:http:/ ,并做了非常有价值的报告。 在 2008 年,一家美国公司,Willow Garage Willow Garage 公司网站:http:/ ,开始大力支持 OpenCV,Vadim Pisarevsky 和 Gary Bradski 都加入了 Willow Gara

27、ge。Gary Bradski 也是 OpenCV 开发者中的元老级人物,他曾出版Leaning OpenCV一书,广受欢迎。 Willow Garage 是一家机器人公司,致力于为个人机器人开发开放的硬件平台和软件。现在已经开发了 PR2 机器人,并支持 ROS、OpenCV、PCL 等软件。ROS (Robot Operating System)是用于机器人的操作系统,是一个开放源代码的软件, OpenCV 作为 ROS 的视觉模块嵌入。 自从获得 Willow Garage 支持后,OpenCV 的更新速度明显加快。大量的新特性被被加入 OpenCV 中,很多算法都是最近一两年的新的科研

28、成果。OpenCV 正日益成为算法研究和产品开发不可缺少的工具。 2.2 OpenCV 的协议 OpenCV 采用 BSD 协议,这是一个非常宽松的协议。简而言之,用户可以修改 OpenCV 的源代码,可以将 OpenCV 嵌入到自己的软件中,可以将包含 OpenCV 的软件销售,可以用于商业产品,也可以用于科研领域。BSD 协议并不具有“传染性”,如果你的软件中使用了 OpenCV,你不需要公开代码。你可以对 OpenCV 做任何操作,协议对用户的唯一约束是要在软件的文档或者说明中注明使用了OpenCV,并附上 OpenCV 的协议。 在这个宽松协议下,企业可以在 OpenCV 基础之上进行产品开发,而不需要担心版权问题(当然你要注明使用了 OpenCV,并附上 OpenCV 的协议)。科研领域的研究者,可以使用 OpenCV 快速地实现系统原型。因此可以这样说,OpenCV 的协议保证了计算机视觉技术快速的传播,让更多的人从 OpenCV 受益。 第3章 图像的基本操作 3.1 图像的表示 在正式介绍之前,先简单介绍一下数字图像的基本概念。如图 3.1 中所示的图像,我们看到的是 Lena 的头像,但是计算机看来,这副图像

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com