1.1 python安装opencv
目前来说使用的python的版本为3.8版本,可以使用pip list 来看拥有的库
pip list
可以看到里面是有opencv的库,使用的opencv-4.4.0.26
在命令行当中使用pip install opencv-python 就可以安装python 当中的opencv的库了
在没有使用换源的情况下,下载的速度是很慢的,所以可以使用下面这个命令来进行安装
pip install opencv-python==4.4.0.46 -i https://pypi.tuna.tsinghua.edu.cn/simple
解释一下该句,==后面是指定对应的版本 ,因为我使用的4.4.0.46 所以我在这里给出的就是4.4.0.46
而-i的意思是指定安装路径,这里可以是你本地路径,也可以是一个网址路径,我在这里使用的是清华的镜像源
为了避免使用的库在低版本拥有而高版本没有了,在这个地方在安装一个对应的 opencv-contrib-python
pip install opencv-contrib-python==4.4.0.46 -i https://pypi.tuna.tsinghua.edu.cn/simple
当上述的两个代码执行完之后,可以再通过pip list 进行查看是否安装了这两个的库
1.2 图像的基本操作
1.2.1读取图像
使用img = cv2.imread(fileName,flags) 来读图像
其中:
- img 是返回值,其值是读取到的图像,如果未读取到图像则返回"None"
- fileName 表示的是要读取的图像的完整文件名
- flags 是读取标记,默认值为1,不填写即为默认,其对应的含义如下表:
| 对应的值 | 对应的含义 | 数字代替值 |
| — | — | — |
| cv2.IMREAD_UNCHANGED | 保持原本格式不变换 | -1 |
| cv2.IMREAD_GRAYSCALE | 将图像调整为单通道的灰度图 | 0 |
| cv2.IMREAD_COLOR | 将图像调整为BGR的3通道图像。该值为默认值 | 1 |
| cv2.IMREAD_ANYDEPTH | 当图像深度为16或者32的时候,返回对应的深度图像,不然就转化为对应的8位深度图像 | 2 |
| cv2.IMREAD_ANYCOLOR | 以任何一种的颜色格式读取图像 | 4 |
| cv2.IMREAD_LOAD_GDAL | 使用gdal驱动程序加载图像 | 8 |
| cv2.IMREAD_REDUCED_GRAYSCALE_N | 将图像转化为单通道的灰度图并且使图像的尺寸减小1/N,N可以取2、4、8 | |
| cv2.IMREAD_REDUCED_COLOR_N | 将图像转化为BGR彩色图像并且使图像的尺寸减小为原来的1/N,N可以取2、4、8 | |
| cv2.IMREAD_IGNORE_ORIENTATION | 不以EXIF的方向位标记旋转图像 | |
要注意到imread当中支持了绝大多数的图像格式:
.bmp、.dib、.jpeg、.jpg、.jpe、.jp2、.png、.webp、.pbm、.pgm、.pxm、.pnm等等
# 例如我们读取一个图像并且显示出来
import cv2 # 这一句是必须要包含的,引入opencv的库
from matplotlib import pyplot as plt
img = cv2.imread("../img_use/kauile.jpg")
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img2 = img[:,:,::-1] # 转化图像到RGB
plt.imshow(img2)
![image.png]([object Object]&name=image.png&originHeight=207&originWidth=1034&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33574&status=done&style=none&taskId=u36360476-32eb-4358-8494-cb027758e48&title=&width=794)
# 因为前面的代码块当中已经有过import cv2了,所以在这里就不需要再导入一遍了
img = cv2.imread("../img_use/kauile.jpg")
print(img)
上述代码当中,使用python的自带函数 print
输出了一个图像,可以看到其中是一个一个的矩阵
1.2.2 显示图像
在OpenCV当中提供了很多的与显示有关的函数
1.nameWindows函数
(该函数在OpenCV4版本当中的部分功能已经被合并到imshow函数当中了)
该函数的意义是用来创建指定名称的窗口,其语法格式如下:
None = cv2.nameWindow(windowName)
其中的windowName指的是窗口的名字,例如下面的代码语句就是创建一个名字叫做Img_show的窗体:cv2.nameWindow("Img_show")
2.inshow函数
imshow函数的语法格式:
None = cv2.inshow(windowName,Mat)
其中有两个参数,第一个是窗体的名字,第二个是传入的Mat类型的图片数据
在OpenCV4的版本当中并不需要创建一个窗体再去显示了,inshow这个函数会自动检测是否有这个窗体,如果没有就新建一个这个名称的窗体并且在这个窗体上显示图片
- 注意:在jupyter的文件当中使用inshow还在显示出来一个窗体,所以更简易使用:
img2 = img[:,:,::-1] # 转化图像到RGB
plt.imshow(img2)
进行显示图像,因为使用imread函数会把图像转化为对应的bgr格式,而使用plt.imshow是显示rgb格式,所以要对应进行转换
在更多的时候,可以自行定义一个函数用于显示图像:
def imgshow(img):
img2 = img[:,:,::-1] # 转化图像到RGB
plt.imshow(img2)
例如使用下面的一段程序进行显示一个图片到Window窗体和在jupyter上
# 因为前面已经引入过对应的头文件了,所以不需要再引入一遍了
img = cv2.imread("../img_use/kauile.jpg")
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
imgshow(img) # 在这个地方,可以看到我们使用了上面的自定义函数
在这个地方要注意到,代码当中imread进行读取的是一个相对路径上的图片,而不是绝对路径上的图片;实际上也可以修改程序绝对路径的图片,因为需要进行实用化,快速部署话,所以这里使用的是相对路径
3.waitKey函数
这个函数是在imshow之后所必须要有的函数,其语法格式:
keyvalue = cv2.waitKey(delayTime)
其中的时间的单位为ms,对应的返回值是键盘按下对应的ascii码
- 要注意一下,waitKey如果是给0的话表示的是无限等待,直到一个按键被按下
- 比较重要的一点是,在imshow之后是必须要进行waitKey的,因为waitKey对应的时间内是inshow进行绘制图像
很多的时候,使用waitKey函数来做与用户的交互函数
如下面的例子:按下A键就关闭窗口,按下B键就生成一个窗口副本
cv2.imshow("test",img)
key = cv2.waitKey(0)
if key is ord('A'):
cv2.destroyAllWindows()
elif key is ord('B'):
cv2.imshow("New imshow",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
因为涉及到窗体,所以没有对应的运行显示在jupyter上
4.destroyWindow函数
该函数的语法格式:
None = cv2.destroyWindows(windowName)
就是他的英语意思,销毁摧毁名字为windowName的窗体,一般来说在程序结束的时候进行窗体的释放
同样的还有一个函数destroyAllWindows()
:
这个函数是销毁或者摧毁所有的因为这个程序而产生的窗体,个人更简易在程序末使用这个函数
1.2.3保存图片
OpenCV当中提供了cv2.imwrite()
函数来进行保存图片,其对应的语法格式:
flag = cv2.imwrite(filename,img[,params])
- flag是返回值,如果保存成功就返回逻辑真,失败就返回逻辑假
- filename 是保存图片的完整的路径名,并且其中是需要写扩展名的
- img 是被保存的图像的名称
- params 是保存类型参数,是可以选择的
注意:
- 使用此imwrite只能保存8位单通道或3通道(带有BGR通道顺序)图像
- 对应的例外:
- 对于PNG,JPEG2000和TIFF格式,可以保存16位无符号(CV_16U)图像。
- 32位浮点(CV_32F)图像可以保存为PFM,TIFF,OpenEXR和Radiance HDR格式; 使用LogLuv高动态范围编码(每像素4个字节)保存3通道(CV_32FC3)TIFF图像
- 可以使用此功能保存带有Alpha通道的PNG图像。为此,创建8位(或16位)4通道图像BGRA,其中alpha通道最后。完全透明的像素应该将alpha设置为0,完全不透明的像素应该将alpha设置为255/65535。
- 如果格式,深度或通道顺序不同,请在保存之前使用Mat :: convertTo和cv :: cvtColor进行转换。或者,使用通用FileStorage I / O函数将图像保存为XML或YAML格式
对应的编码参数
值 | 解释 |
cv.IMWRITE_JPEG_QUALITY | 对于JPEG,它可以是从0到100的质量(越高越好)。默认值为95 |
cv.IMWRITE_JPEG_PROGRESSIVE | 启用JPEG功能,0或1,默认为False |
cv.IMWRITE_JPEG_OPTIMIZE | 启用JPEG功能,0或1,默认为False |
cv.IMWRITE_JPEG_RST_INTERVAL | JPEG重启间隔,0 - 65535,默认为0 - 无重启 |
cv.IMWRITE_JPEG_LUMA_QUALITY | 单独的亮度质量等级,0 - 100,默认为0 - 不使用 |
cv.IMWRITE_JPEG_CHROMA_QUALITY | 单独的色度质量等级,0 - 100,默认为0 - 不使用 |
cv.IMWRITE_PNG_COMPRESSION | 对于PNG,它可以是从0到9的压缩级别。值越高意味着更小的尺寸和更长的压缩时间。如果指定,则策略更改为IMWRITE_PNG_STRATEGY_DEFAULT(Z_DEFAULT_STRATEGY)。默认值为1(最佳速度设置) |
cv.IMWRITE_PNG_STRATEGY | 默认为IMWRITE_PNG_STRATEGY_RLE |
cv.IMWRITE_PNG_BILEVEL | 二进制级别PNG,0或1,默认为0 |
cv.IMWRITE_PXM_BINARY | 对于PPM,PGM或PBM,它可以是二进制格式标志,0或1.默认值为1 |
cv.IMWRITE_EXR_TYPE | |
cv.IMWRITE_WEBP_QUALITY | 覆盖EXR存储类型(默认为FLOAT(FP32)) |
对于WEBP,它可以是1到100的质量(越高越好)。默认情况下(不带任何参数),如果质量高于100,则使用无损压缩 | |
cv.IMWRITE_PAM_TUPLETYPE | 对于PAM,将TUPLETYPE字段设置为为格式定义的相应字符串值 |
cv.IMWRITE_TIFF_RESUNIT | 对于TIFF,用于指定要设置的DPI分辨率单位; 请参阅libtiff文档以获取有效值 |
cv.IMWRITE_TIFF_XDPI | 对于TIFF,用于指定X方向DPI |
cv.IMWRITE_TIFF_YDPI | 对于TIFF,用于指定Y方向DPI |
cv.IMWRITE_TIFF_COMPRESSION | 对于TIFF,用于指定图像压缩方案。请参阅libtiff以获取与压缩格式对应的整数常量。注意,对于深度为CV_32F的图像,仅使用libtiff的SGILOG压缩方案。对于其他支持的深度,可以通过此标志指定压缩方案; LZW压缩是默认值 |
cv.IMWRITE_JPEG2000_COMPRESSION_X1000 | 对于JPEG2000,用于指定目标压缩率(乘以1000)。该值可以是0到1000.默认值是1000 |
注意,如果是直接保存的话,是保存到和代码一个路径下
flas = cv2.imwrite("img.jpg",img)
是可以在同一级的目录下看到对应的保存的图片的
1.3 OpenCV 库模块介绍
OpenCV的库包含了两个部分,一个是主库,一个是contrib库
- 主库是比较稳定且成熟的,核心由OpenCV团队维护
- contirb库,主要由社区开发和维护,其中包含的算法更加全面,并且包含了一些受专利保护的算法,使用之前要注意是否商业化
OpenCV库模块介绍:
- calib3d——这个模块的名称是由calibration(校准)和3D两个属于的缩写组合而成的,该模块主要包含相机标定与立体视觉等功能,例如物体位姿估计、三维重建、摄像头标定等
- core——核心功能模块。这个模块主要包含OpenCV库的基础结构以及基本操作,例如OpenCV基本数据结构、绘图函数、数组操作等相关函数
- dnn——深度学习模块。这个模块是OpenCV4版本的特色,主要包括了构件神经网络加载序列化网络模型。但是这个模块模块仅适用于正向传递计算,原则上不支持反向计算
- features2d——这个模块名称是由features(特征)和2D两个术语的缩写组合而成,功能主要为处理图像特征,例如特征检测、描述与匹配
- flann——这个模块的全程是快速近似最近邻库的缩写。这个模块是高维的近似邻快速的搜索算法库,主要包含快速近似近邻搜索与聚类等
- gapi——这个模块是OpenCV4中新添加的模块,旨在加速常规的图像处理。与其他模块相比,这个模块主要充当框架,而不是某些特定的计算机视觉算法
- highgui——高层GUI,包含创建和操作显示图像、处理鼠标事件以及键盘命令、提供图像交互可视化界面等
- imgcodecs——图像文件读取与保存模块,主要用于图像文件读取与保存
- imgproc——这个模块名称是由(图像)和process(处理)两个术语组成,是重要的图像处理模块,包含了图像滤波、几何变换、直方图、特征检测与目标检测等
- ml——机器学习模块,主要为统计分类、回归和数据聚类等
- objdetect——目标检测模块,主要用于图像目标检测,例如检测Harr特征
- photo——计算摄影模块,主要包含图像修复和去噪等算法
- stitching——图像拼接模块,主要包含了特征点的寻找与匹配图像、估计旋转、自动校准、接缝估计等图像拼接过程的相关内容
- video——视频分析模块,主要包含了运动估计、背景分离、对象跟踪等视频处理相关内容
- videoio——视频输入/输出模块,主要用于读取/写入视频