第一章 opencv基本概念

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](https://img-blog.csdnimg.cn/img_convert/2de5c71b75839f2fdf86a44301f59092.png#clientId=u1e8226c4-28f5-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=159&id=u0c7d2e60&margin=[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_INTERVALJPEG重启间隔,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——视频输入/输出模块,主要用于读取/写入视频
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值