OpenCV入门教程.docx
- 文档编号:16089180
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:41
- 大小:1.19MB
OpenCV入门教程.docx
《OpenCV入门教程.docx》由会员分享,可在线阅读,更多相关《OpenCV入门教程.docx(41页珍藏版)》请在冰点文库上搜索。
OpenCV入门教程
本页仅作为文档封面,使用时可以删除Thisdocumentisforreferenceonly-rar21year.March
OpenCV入门教程
OpenCV入门教程
作者:
于仕琪
年8月
版权所有于仕琪
本作品采用知识共享署名-相同方式共享国际许可协议进行许可。
1
前言
OpenCV是一个广受欢迎的开源计算机视觉库,它提供了很多函数,实现了
很多计算机视觉算法,算法从最基本的滤波到高级的物体检测皆有涵盖。
很多初学者希望快速掌握OpenCV的使用方法,但往往会遇到各种各样的困难。
其实仔细分析,造成这些困难的原因有两类:
第一类是C/C++编程基础不过关;第二类是不了解算法原理。
解决这些困难无非提升编程能力,以及提升理论基础知识。
提升编程能力需要多练习编程,提升理论知识需要系统学习《数字图像处理》、《计算机视觉》和《模式识别》等课程,所有这些都不能一蹴而就,需要耐下心来认真修炼。
同时我们也需要认识到OpenCV只是一个算法库,能为我们搭建计算机视觉应用提供“砖头”。
我们并不需要完全精通了算法原理之后才去使用OpenCV,只要了解了“砖头”的功能,就可以动手了。
在实践中学习才是最高效的学习方式。
本小册子希望为初学者提供引导,使初学者快速了解OpenCV的基本数据结构以及用法。
此外,如您发现有错误之处,欢迎来信指正。
于仕琪
深圳大学
插播广告:
欢迎有能力、有激情以及对计算机视觉有兴趣的同学报考我的
研究生。
欲了解详情可以访问深圳大学招生网或者
给我发email。
2
第1章
预备知识...............................................................................................
5
编程的流程........................................................................................
5
什么叫编辑........................................................................................
6
什么叫编译........................................................................................
6
什么叫连接........................................................................................
7
什么叫运行........................................................................................
7
VisualC++是什么..................................................................................
8
头文件................................................................................................
9
库文件..............................................................................................
10
OpenCV是什么...................................................................................
11
什么是命令行参数..........................................................................
12
常见编译错误..................................................................................
13
找不到头文件.........................................................................
13
拼写错误.................................................................................
14
常见链接错误..................................................................................
15
运行时错误......................................................................................
17
第2章
OpenCV介绍...................................................................................
19
OpenCV的来源...................................................................................
19
OpenCV的协议...................................................................................
19
第3章
图像的基本操作.................................................................................
21
图像的表示......................................................................................
21
Mat类.................................................................................................
23
创建Mat对象.................................................................................
24
构造函数方法...........................................................................
24
create()函数创建对象...............................................................
25
Matlab风格的创建对象方法...................................................
26
3
矩阵的基本元素表达......................................................................
26
像素值的读写..................................................................................
27
at()函数......................................................................................
28
使用迭代器...............................................................................
29
通过数据指针...........................................................................
30
选取图像局部区域..........................................................................
32
单行或单列选择.......................................................................
32
用Range选择多行或多列.......................................................
33
感兴趣区域...............................................................................
33
取对角线元素...........................................................................
34
Mat表达式.........................................................................................
34
Mat_类................................................................................................
36
Mat类的内存管理.............................................................................
38
输出..................................................................................................
40
Mat与IplImage和CvMat的转换.................................................
42
Mat转为IplImage和CvMat格式..........................................
42
IplImage和CvMat格式转为Mat...........................................
42
第4章
数据获取与存储.................................................................................
44
读写图像文件..................................................................................
44
读图像文件...............................................................................
44
写图像文件...............................................................................
45
读写视频..........................................................................................
47
读视频.......................................................................................
47
写视频.......................................................................................
49
4
第1章预备知识
OpenCV是一个功能强大的计算机视觉库,要用好它,除了要具有相关的计算机视觉理论知识外,还需要具有一定的编程能力。
本书作者通过对OpenCV中文论坛中的大量问题观察,发现有很大比例的问题是因为用户对C/C++语言不熟练,导致出错,或出错后不知如何解决。
如果对C/C++语言不熟悉,那使用OpenCV时会满头雾水瞎摸索,费心费力。
在这一章中,将介绍一些编程的基本概念,让读者对编程的流程有一个基本了解。
这样在出现错误时,可以快速确定错误的类型,并知道该如何解决。
编程的流程
一个编程的基本流程包括编辑、编译和连接三大步骤。
其流程图如图所
示。
编辑编辑
编译编译
连接
5
图编程的基本流程
什么叫编辑
编辑(edit)代码即编写代码,是编程的第一步。
你可以任意一个编辑器进行代码的编写。
你可以使用Windows自带的“记事本”来编写代码,也可以使用Notepad++,或者VisualStudio提供的编辑器。
图使用Windows自带的记事本编辑代码
虽然可以使用记事本软件编辑代码,但是记事本软件的功能非常有限。
缺少常用的语法高亮,自动缩进等功能。
所以可以使用其他功能更丰富的编辑器,如
Notepad++(图)等。
图使用Notepad++软件编辑代码
什么叫编译
编译(compile)是将用某种编程语言(如C++语言)写成的源代码,转换成目标文件。
目标文件包含着机器代码(可直接被计算机中央处理器执行)以及代码在运行时使用的数据。
编译器(compiler)是实现这一目的的软件。
编译器有很多,如在Windows下有微软公司的,在Linux下有gcc和g++。
在命令行
6
下使用对源代码进行编译,如图所示。
编译后,将得到目标文件,如图所示。
图在命令行下使用对进行编译
图编译后,将新生成目标文件
什么叫连接
连接(link)是将多个目标文件,以及库文件生成可执行的文件(或静态库、或动态库)的过程。
连接器(linker)是实现这一目的的软件。
常用的连接器有
Windows下的,Linux下的ld等。
在Windows下可以使用将前面生成的连接为可执行文件。
在命令行下效果如所图示。
连接后,将生成可执行文件,如图所示。
图在命令行下使用对进行连接
图连接后,将新生成可执行文件
什么叫运行
运行(run)较容易理解,我们在Windows资源管理器里用鼠标双击exe可执行程序,可以使程序被载入CPU运行。
我们也可以在命令行窗口中输入可执
7
行程序的文件名运行,如图所示。
图在命令行窗口中运行,可以看到程序打印到标准输出的结果。
VisualC++是什么
通过前面的介绍,可以看到一个编程的流程:
编辑->编译->连接->运行。
更具体来说,完成这个流程需要你:
1.打开记事本软件,编辑代码,并保存;
2.在命令行下运行编译器,对代码进行编译,生成目标文件;
3.在命令行下运行连接器,将目标文件连接起来,生成可执行程序;
4.在命令行下,或Windows资源管理器中运行程序,验证程序的正确性。
如果你的项目只有一个源代码文件,完成上面四个步骤尚可接受。
但是如果你的项目包括几十个甚至几百个源文件,如无其他软件辅助,只用上面四个非常基本的步骤进行编程开发,会让人抓狂。
集成开发环境(IntegratedDevelopmentEnvironment,简称IDE)可以帮助你对项目进行管理。
常用的IDE有微软公司的VisualStudio,里面包含VisualC++,VisualC#等,其他的还有Eclipse、NetBeans、Delphi等。
因此我们平时所说的VC
不是一种编程语言,也不是编译器,它只是一个IDE。
IDE一般包含编辑器。
IDE自带的编辑器一般都针对编程语言进行了定制,实现语法高亮、自动缩进、自动补全等方便的功能。
IDE还提供丰富的菜单和按钮工具,如图、图和图所示。
如果你点击IDE中的“生成(build)”按钮(图),或者点击菜单“生成(build)”中的菜单项“生成项目(buildproject)”,那么IDE会去调用编译器和连接器来生成可执行程序。
如果你在调试状态下,还会去调用调试器(debugger)。
IDE会提升程序开发的效率,特别是调试程序的效率。
8
图微软VisualStdio集成开发环境
图VisualStdio中的编辑按钮
图VisualStdio中的生成程序按钮
头文件
在编程过程中,程序代码往往被拆成很多部分,每部分放在一个独立的源文件中,而不是将所有的代码放在一个源文件中。
考虑一个简单的小例子:
程序中有两个函数main()和foo()。
main()函数位于,foo()函数位于,
main()函数中调用foo()函数。
在编译阶段,由于编译是对单个文件进行编译,所以编译时,编译器不知道是否存在foo()函数以及foo()调用是否正确,因此需要头文件辅助。
也就是说,在编译命令:
/c
运行时,编译器不知道foo的用法是否正确(因为foo在另一个文件中),只有借助头文件中的函数声明来判断。
对进行编译时,不会涉及
文件,只会涉及和(因为被include)文件。
头文件的作用如图所示。
9
1.foo()函数这样用对
#include""
intmain()
{
inti=foo(3,4);
returni;
}
2.函数声明是intfoo(inti,intj),你的调用看上去是对的。
intfoo(inti,intj);
#include""
intfoo(inti,intj)
{
……
}
图对进行编译时,需要利用头文件中的foo()函数声明来确认中
对foo()的调用是正确的
库文件
库文件中包含一系列的子程序。
例如在上一节的例子中,源文件中实现了foo()函数,我们假设foo()函数是包含重要算法的函数,我们需要将foo()函数提供给客户使用,但是不希望客户看到算法源代码。
为了达到这一目的,我们可以将编译程库文件(图),库文件是二进制的,在库文件中是看不到原始的源代码的。
库和可执行文件的区别是,库不是独立程序,他们是向其他程序提供服务的代码。
当然使用库文件的好处不仅仅是对源代码进行保密,使用库文件还可以减少重复编译的时间,增强程序的模块化。
将库文件连接到程序中,有两种方式,一种是静态连接库,另一种是动态连接库。
如果希望了解更多关于库文件的知识,请查阅相关资料,再次不详细分析它们之间的异同。
10
用户
开发者
编辑
编辑
编译
编译
连接
图库是二进制的文件,里面包含一系列子程序(图有问题)
OpenCV是什么
OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。
例如C接口函数cvCanny()实现了Canny边缘提取算法。
可以直接将这些源代码添加到我们自己的软件项目中,而不需要自己再去写代码实现Canny算法,也就是不需要重复“造轮子”。
由于OpenCV中源代码文件巨多,根据算法的功能,将这些源文件分到多个模块中:
core、imgproc、highgui等。
将每个模块中的源文件编译成一个库文件(如、、等),用户在使用时,仅将所需的库文件添加到自己的项目中,与自己的源文件一起连接成可执行程序则可。
11
什么是命令行参数
C/C++语言中的main函数,经常带有参数argc,argv,如下:
intmain(intargc,char**argv)
或者
intmain(intargc,char*argv[])
在上面代码中,argc表示命令行输入参数的个数(以空白符分隔),argv中存储了所有的命令行参数。
假如你的程序是,如果在命令行运行该程序(如图。
首先应该在命令行下用cd命令进入到文件所在目录),运行命令为:
ShiqiYu
那么,argc的值是3,argv[0]是"",argv[1]是"Shiqi",argv[2]是"Yu"。
图使用命令行参数运行程序
下面的程序演示argc和argv的使用:
#include<>
intmain(intargc,char**argv)
{
inti;
for(i=0;i printf("Argument%dis%s.\n",i,argv[i]);return0; } 假如上述代码编译为,那么运行 abcde 12 将得到 Argument0is. Argument1isa. Argument2isb. Argument3isc. Argument4isd. Argument5ise. 运行 将得到 Argument0is. Argument1is. 常见编译错误 在编程中,经常会出现各种错误。 出现错误后,不要闭眼抱头作痛苦状。 出现错误后,需要做的第一件事情是阅读出错信息。 出错信息虽然看似凌乱,但是能够提供很多有价值的信息,帮你解决问题。 找不到头文件 找不到头文件往往会提示如下错误: (2): fat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenCV 入门教程