第1章 OpenCV入门
Opencv
是一个开源的计算机视觉库,1990年由英特尔的 Gary Bradski启动。Bradski在访 学过程中注意到,在很多优秀大学的实验室中,都有非常完备的内部公开的计算机视觉接口。这些接口从一届学生传到另一届学生,对于刚入门的新人来说,使用这些接口比重复造轮子方 便多了。这些接口可以让他们在之前的基础上更有效地开展工作。Opencv正是基于为计算机 视觉提供通用接口这一目标而被策划的。
由于要使用计算机视觉库,用户对处理器(CPU)的要求提升了,他们希望购买更快的处 理器,这无疑会增加英特尔的产品销量和收入。这也许就解释了为什么 Opencv是由硬件厂商而非软件厂商开发的。当然,随着 Opencv项目的开源,目前其已经得到了基金会的支持,很大一部分研究主力也转移到了英特尔之外,越来越多的用户为 Opencv做出了贡献。
Opencv库由C和C+语言编写,涵盖计算机视觉各个领域内的500多个函数,可以在多 种操作系统上运行。它旨在提供一个简洁而又高效的接口,从而帮助开发人员快速地构建视觉应用。
Opencv更像一个黑盒,让我们专注于视觉应用的开发,而不必过多关注基础图像处理的具体细节。就像 Photoshop一样,我们可以方便地使用它进行图像处理,我们只需要专注于图 像处理本身,而不需要掌握复杂的图像处理算法的具体实现细节。
本章将介绍 Opencv的具体配置过程及基础使用方法。
1.1 如何使用
Python的开发环境有很多种,在实际开发时我们可以根据需要选择一种适合自己的。在本书中,我们选择使用 Anaconda作为开发环境。本节简单介绍如何配置环境,来实现在 Anaconda下使用基于 Python语言的 Opencv库。
1. Python的配置
在本书中,我们使用的是 Python3版本。虽然 Python2和 Python3有很多相同之处,以至于 Python2的读者也可以使用本书,但还是要说明一下,本书直接面向的版本是 Python3。
可以在Python的官网上(htps:/www.python.org/downloads/)下载Python3的解释器。在该网页顶部已经指出了最新的版本,例如“ Download Python3.7.0”就表示当前(2018年10月9日)的最新版本是 Python3.7.0,单击“ Download Python3.70”,就会开始下载解释器软件。
如果想安装其他版本,可以向下拖动鼠标,你将看到一个滚动页面,其中显示了一个列表集,其中列出了不同的安装包,具体选择哪种安装包依赖于两个因素:
- 操作系统,例如 Windows、 macos、Liux等
- 处理器位数,例如32位或者64位。
根据自己的计算机配置,在列表集中选择对应的安装包下载。
下载完成后,按照提示步骤完成安装即可。
2.Anaconda配置
可以在Anaconda的官网上(htps:/www.anaconda.com/download/)下载Anaconda。在下载 页顶部指出了当前的最新版本。
如果想安装其他版本,可以在下载页内根据实际情况选择。具体选择哪种安装包依赖于三个因素
- Python的版本,例如 Python2.7或者 Python3.7等
- 操作系统,例如 Windows、 macos、 Linux等。
- 处理器位数,例如32位或者64位
根据自己的环境配置,在下载页中选择对应的安装包下载。下载完成后,按照提示步骤完成安装即可。
3.OpenCV的配置
可以从官网下载 Opencv的安装包,编译后使用;也可以直接使用第三方提供的预编译包 安装。
在本书中,我们选择由PyPI提供的 Opencv安装包,可以在htps:/ pypi. org/project/opencv-python/上面下载最新的基于 Python的 Opencv库。同样,下载页顶部指出了当前的最 新版本。
如果想安装其他版本,可以在 Download files栏目内根据实际情况选择。具体选择哪种安装包依赖于三个因素:
- Python的版本,例如 Python2.7或者 Python3.7等。
- 操作系统,例如 Windows、 macos、 Linux等。
- 处理器位数,例如32位或者64位。
完成下载后,在 Anaconda Prompt内使用 pip install完整路径文件名完成安装。例如,假设文件存储在D: anacondallib目录下面,则要使用的语句为:
>> pip install F:\anaconda\Lib\opencv_python-3.4.3.18-cp37-cp37m-win_amd64.whl
![d90d1eea67021ed3fcdf24e5326f125f.png](https://i-blog.csdnimg.cn/blog_migrate/7b491764a670124ec90cbfa499d4c76e.png)
安装完成后,可以在 Anaconda Prompt I内使用 conda list语句查看安装是否成功。如果安装成功,就会显示安装成功的 Opencv库及对应的版本等信息。需要注意,不同安装包的名称及版本号可能略有差异。例如,图1-1中的包列表显示了系统内配置了 Opencv其他版本的情况,该图说明在当前系统内配置的是 Opencv4.4.0.44版本。
![3d7a3c4d377af590f63e7dfdcf9fdf0c.png](https://i-blog.csdnimg.cn/blog_migrate/76d56dbfe1987caa8b6a9f85f1713c37.png)
这里主要介绍了如何在 Windows系统下对环境进行配置,如果需要配置其他操作系统下的环境,请参考官网的具体介绍。
1.2 图像处理操作
在图像处理过程中,读取图像、显示图像、保存图像是最基本的操作。本节将简单介绍这几项基本操作。
1.2.1 读取图像
Opencv提供了函数cv2.imrad
来读取图像,该函数支持各种静态图像格式。该函数的语 法格式为:
retval=cv2.imread( filename[, flags]
式中:
retval
是返回值,其值是读取到的图像。如果未读取到图像,则返回“Nonefilename
表示要读取的图像的完整文件名。flags
是读取标记。该标记用来控制读取文件的类型,具体如表1-1所示。表1-1中的第一列参数与第三列数值是等价的。例如cv2.IMREAD UNCHANGED=-1,在设置参数时,既可以使用第一列的参数值,也可以采用第三列的数值。
![2ed384d3be60aedaebfda86303ab94a2.png](https://i-blog.csdnimg.cn/blog_migrate/c569d0d7ca1ed45c29322b027f144736.png)
![58938b2db2676f11599bd0336ee3e63b.png](https://i-blog.csdnimg.cn/blog_migrate/be96169103e79c164c5d258384870c27.png)
函数cv2.imread()能够读取多种不同类型的图像,具体如表1-2所示。
![2ca6cbd0973ddd2637ca7c4180f2e78b.png](https://i-blog.csdnimg.cn/blog_migrate/fdfd52b6b50ff55b1e10a9fe572d5ea8.png)
例如,想要读取当前目录下文件名为lena.bmp的图像,并保持按照原有格式读入,则使用 的语句为:
lena=cv2. imread("lena. bmp",-1)
需要注意,上述程序要想正确运行,首先需要导入cv2
模块,大多数常用的 Opencv函数都在cv2模块内。与cv2模块所对应的cv模块代表传统版本的模块。这里的cv2模块并不代表该模块是专门针对 Opencv2版本的,而是指该模块引入了一个改善的API接口。在cv2模块内部采用了面向对象的编程方式,而在cv模块内更多采用的是面向过程的编程方式。 本书中所使用的模块函数都是cv2
模块函数,为了方便理解,在函数名前面加了“cv2.”。但是如果函数名出现在标题中,那么希望突出的是该函数本身,所以未加“cv2.”
【例1.1】使用cv2.tread()函数读取一幅图像。根据题目要求,编写代码如下:
import cv2
lena=cv2. imread("lenacolor.png")
print(lena)
上述程序首先会读取当前目录下的图像lena.bmp,然后使用 print语句打印读取的图像数据。运行上述程序后,会输出图像的部分像素值,如图1-2所示。
![d29bae774a1fe3de6276da3560185351.png](https://i-blog.csdnimg.cn/blog_migrate/3d05926d87257bf6af67e548eb7e177f.png)
1.2.2 显示图像
Opencv提供了多个与显示有关的函数,下面对常用的几个进行简单介绍。
- namedWindow函数
函数cv2.namedWindow()用来创建指定名称的窗口,其语法格式为:
None =cv2. namedwindow( winname)
式中, winname是要创建的窗口的名称。例如,下列语句会创建一个名为 lesson的窗口:
cv2. namedwindow(lesson)
- imshow函数
函数cv2. ishow用来显示图像,其语法格式为:
None = cv2.imshow(winname,mat)
式中:
- winname是窗口名称。
- mat是要显示的图像。
【例1.2】 在一个窗口内显示读取的图像。
根据题目要求,编写代码如下:
import cv2
lena=cv2.imread("lena. bmp")
cv2. namedwindow("lesson")
cv2. imshow("lesson", lena)
在本程序中,首先通过cv2.read()
函数读取图像lena.bmp
,接下来通过cv2.namedWindow
函数创建一个名为 lesson
的窗口,最后通过cv2.imshow
函数在窗口 lesson内显示图像lena.bmp。
运行上述程序,得到的运行结果如图1-3所示。
![ebec7fcefafba34e91369df1ee178c38.png](https://i-blog.csdnimg.cn/blog_migrate/7d1219891fe5eb38d4097c7beb720daf.png)
在实际使用中,可以先通过函数cv2.namedWindow()来创建一个窗口,再让函数cv2.imshow()引用该窗口来显示图像。也可以不创建窗口,直接使用函数cv2.imshow()引用一个并不存在的窗口,并在其中显示指定图像,这样函数cv2.imshow()实际上会完成如下两步操作.
第1步:函数cv2. imshow()创建一个指定名称的新窗口。
第2步:函数cv2.imshow()将图像显示在刚创建的窗口内。
例如,在下面的语句中,函数cv2. imshow()完成了创建demo窗口和显示 image图像的操 作,该语句的功能与例1.2相同。
import cv2
lena=cv2.imread("lena. bmp")
cv2.imshow("demo", lena)
在显示图像时,初学者最经常遇到的一个错误是“eror:(-215: Assertion failed)size. width>0&&size. height>0 in function'cv: ashow”
,说明当前要显示的图像是空的(None),这通常是由 于在读取文件时没有找到图像文件造成的。一般来说,没有找到要读取的图像文件,可能是因为文件名错误;如果确认要读取的图像的完整文件名(路径名和文件名)没有错,那么往往是工作路径配置错误造成的。
例如,当前程序所在路径为e: \lesson
,要读取当前路径下存在的图像 image\lena.bmp
。那么:
- 如果设置的当前工作路径是e: lesson,程序就会读取当前工作路径下的文件imagellena.bmp,该文件的完整文件名就是e: Nesson\ image\lena.bmp。正是我们想要读取 的指定文件。
- 如果设置的当前工作路径不是e:\lesson,例如,当前的工作路径是e: \python,程序仍然会读取当前工作路径下的文件 image\lena.bmp(而不是读取当前程序所在路径下的imagellena.bmp),该文件的完整文件名就是e: \python\ image \lena.bmp。显然,这样是无法读取到指定图像的。
为了避免上述错误,可以在读取图像前判断图像文件是否存在,并在显示图像前判断图像是否存在。
- witkey函数
函数cv2.witkey()
用来等待按键,当用户按下键盘后,该语句会被执行,并获取返回值。其语法格式为:
retval =cv2.witkey([delay]
式中:
retval
表示返回值。如果没有按键被按下,则返回-1:如果有按键被按下,则返回该按 键的ASCI码delay
表示等待键盘触发的时间,单位是ms。当该值是负数或者零时,表示无限等待。该值默认为0.
在实际使用中,可以通过函数cv2.witkey
获取按下的按键,并针对不同的键做出不同的 反应,从而实现交互功能。例如,如果按下A键,则关闭窗口:如果按下B键,则生成一个窗口副本。
![72e562b0e8e35d8d103b99af45918977.gif](https://i-blog.csdnimg.cn/blog_migrate/0fb9aa2150a6cb90c4062d566ae4c932.gif)
![87c2e4e242e33b6faeb71d0a41c1f60c.png](https://i-blog.csdnimg.cn/blog_migrate/eb0f7cc35479cb8a58ab0a47e20640ee.jpeg)
joker-wt
扫码|关注我们
微信号|joker-wt123
新浪微博|梧tw桐
承蒙关照!!!
我的心愿是——世界和平