《OpenCV计算机视觉开发实践:基于Python》【摘要 书评 试读】- 京东图书
在线安装opencv-python
Python安装完成后,我们可以继续搭建OpenCV开发环境。所谓在线安装,意思是安装过程中要连着外网(Internet),边下载边安装。
要用Python开发OpenCV程序,首先要为Python安装配置OpenCV开发包。安装Python相关功能包需要用到pip,它是一个通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。如果安装了Python 3.x,就会默认安装pip工具,其位置在Python的安装路径下。比如,笔者计算机上的Python包管理工具pip.exe的路径位于C:\Users\Administrator\AppData\ Local\Programs\Python\Python38\Scripts\。这个路径是64位系统的,读者可以查找一下自己计算机pip.exe的路径。打开命令行窗口,输入“pip”,如果出现很多选项,就说明pip工作正常了,如图2-5所示。
图2‑5
下面利用pip来安装OpenCV开发环境。安装OpenCV开发环境只需要下载NumPy、Matplotlib、opencv-python三个包。其中,NumPy包是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Matplotlib包是Python中类似 MATLAB的绘图工具,因为图像处理中有很多直方图统计之类的操作,所以选择了Matplotlib这个Python的第三方包。
首先更新升级setuptools配置工具。pip和很多的包管理工具一样,是从国外源下载的,因此速度会比较慢,甚至会安装不了。此时,我们可以指定从国内下载,即在使用pip的时候加上参数 -i https://pypi.tuna.tsinghua.edu.cn/simple,这样就会从清华镜像库去安装setuptools库。我们在命令行下输入如下命令:
pip install --upgrade setuptools -i https://pypi.tuna.tsinghua.edu.cn/simple
setuptools也是一个Python配置工具。这个包下载安装比较快,如果出现错误提示“mysql-connector-python 8.0.25 requires protobuf>=3.0.0, which is not installed”,可以把protobuf安装一下,安装命令是“pip3 install protobuf”,然后再次运行升级命令。
然后再安装NumPy和Matplotlib库,输入如下命令:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
这一步下载需要花点时间,最终下载完成如图2-6所示。
最后我们可以开始安装opencv-python了,本书用的OpenCV版本是4.10,我们可以指定版本号来安装opencv-python,输入如下命令:
pip install opencv-python==4.10.0.84 -i https://pypi.tuna.tsinghua.edu.cn/simple
图2‑6
注意,上面命令中版本号4.10.0.84前面有2个等于号(==)。运行该命令后稍等片刻,下载安装完成,如图2-7所示。
图2‑7
稍等片刻,opencv-python安装完成了,此时一个名为cv2的文件夹已经生成在以下路径了:
C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Lib\site-packages\
cv2文件夹存放的是OpenCV编程所需要的内容。如果要查看当前电脑上安装的OpenCV版本,可以运行如下命令:pip show opencv-python。
至此,基于Python的命令行OpenCV开发环境建立起来了,下面开始我们用Python开发的第一个OpenCV程序。此时没有安装IDE,可以暂时使用记事本编辑这个程序。所谓命令行OpenCV开发环境,就是运行OpenCV程序需要在命令行窗口下用命令来运行。这种方式效率不高,一线企业级开发一般使用集成开发环境(IDE)。
【例2.1】 第一个OpenCV程序
#coding=gbk
#导入cv模块
import cv2 as cv
#读取图像,支持BMP、JPG、PNG、TIFF等常用格式
img = cv.imread("opencv-logo2.png")
cv.imshow("Hello,python opencv",img) #显示窗口
#等待按键
cv.waitKey(0)
#释放窗口
cv.destroyAllWindows()
首先利用import语句导入模块cv2(OpenCV是由很多个模块组成的,cv2是OpenCV中的一个基本模块)。使用as语法之后,只能通过as后面的名字来访问导入的模块,因此后面代码要用cv来代表cv2。
模块导入后,就可以使用cv2里的函数了。我们先利用函数cv.imread读取一个文件opencv-logo2.png,该文件位于工程目录下,cv.imread也可以传入一个绝对路径,比如d:\opencv-logo2.png。接着用函数imshow把图片显示在窗口中。函数waitKey用于等待用户按键,如果用户不按键,则图片窗口会一直显示,也就是函数waitKey一直处于阻塞状态不返回,直到用户按键才返回。waitKey结束后调用函数destroyAllWindows销毁所有窗口,这里就一个窗口,就是我们用namedWindow函数创建的窗口。
我们把上述代码在记事本中输入后,然后在某个路径下保存为2.1.py。打开命令行窗口并定位到2.1.py所在的目录,然后执行命令:
python 2.1.py
在上面命令中,python后面有一个空格,而且图片文件opencv-logo2.png要和2-1.py在同一个目录下。最终运行结果如图2-8所示。
图2‑8
运行成功,说明我们的opencv-python开发环境搭建成功了。下面再看一个稍微复杂一点的例子。
【例2.2】 把两幅图片混合后输出
import cv2 as cv #导入cv模块
import numpy as np #导入numpy模块
import sys
alpha = 0.5
print("线性混合")
input=float(input('* 输入第一幅图片的权重alpha [0.0-1.0]:'))
print(input)
if 0 <= input <= 1: #判断输入合法性
alpha = input
src1 = cv.imread("p1.jpg"); #读取第一幅图片
src2 = cv.imdecode(np.fromfile("山水.jpg",dtype=np.uint8),-1) #读取图片
if src1 is None: #判断p1.jpg是否读取成功
sys.exit("Could not read the p1.jpg.") #如果读取为空,则退出程序
if src2 is None: #判断山水.jpg是否读取成功
sys.exit("Could not read the 山水.jpg.") #如果读取为空,则退出程序
beta = (1.0 - alpha);
dst=cv.addWeighted(src1, alpha, src2, beta, 0.0, 0) #将图1与图2线性混合
cv.imshow("result",dst) #显示混合后的图片
cv.waitKey(0) #等待按键
NumPy模块包含大量的各种数学运算的函数,包括三角函数、算术运算的函数、复数处理函数等。上述代码的功能将图片p1.jpg和山水.jpg这两幅图片进行混合,它们大小必须一样。这两幅图片目前都保存在工程源码目录下。其中,imread函数用来读取图片,由于imread不支持中文文件名,我们通过np.fromfile来读取山水.jpg,fromfile可以支持中文文件名,这个函数用法后面章节会详细讲到,这里只要了解即可。
addWeighted函数是将两幅相同大小、相同类型的图片进行融合,第二个参数alpha表示第一幅图片所占的权重,第四个参数beta表示第二幅图片所占的权重。权重越大,图片显示得越多,比如设置alpha为0.9(见图2-9),则主要显示第一幅图片。
运行工程,结果如图2-10所示,可以看到设置第一幅图片权重是0.9后,第二幅图片就淡了很多。
图2‑9
图2‑10
至此,基于Python的OpenCV的开发环境就搭建起来了。