Python OpenCV库
图像处理,怎么能不学OpenCV呢
前言
OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。
OpenCV依赖一些库,比如Numpy,自行安装。
OpenCV应用领域:
1、计算机视觉领域方向
2、人机互动
3、物体识别
4、图像分割
5、人脸识别
6、动作识别
7、运动跟踪
8、机器人
9、运动分析
10、机器视觉
11、结构分析
12、汽车安全驾驶
安装:
# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python |
关于M1下安装请看:https://blog.csdn.net/jjw_zyfx/article/details/119851647
读取操作
import cv2 |
PIL库和opencv库在读取图片上的差异:
- opencv:图片的通道顺序为BGR,显示的尺寸为(高/行数,宽/列数,通道数)
- PIL:通道顺序为RGB,显示的尺寸为(宽,高)
获取并修改图像中的像素点
import numpy as np |
获取图像属性
图像通道的拆分与合并
# 通道拆分 |
基本变换
图像缩放:resize()
 |
颜色空间的转换:cv2.cvtColor()
""" |
图像阈值化:cv2.threshold()
图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像。
|
阈值类型:
旋转:cv2.getRotationMatrix2D()
""" |
图像的矩阵变换:transpose()
旋转
import cv2 |
另一种旋转方法:cv2.flip
:
对图像矩阵进行翻转处理,参数可以设置为1,0,-1,分别对应着水平翻转、垂直翻转、水平垂直翻转。
image1 = cv2.flip(image, -1) #原图顺时针旋转180度 |
OpenCV读入图片的矩阵格式是:(h, w, c)。 深度学习中,因为要对不同通道应用卷积,所以会采取另一种方式(c, h, w)
print(im.shape) # (326,220,3) |
在深度学习搭建CNN时,往往要做相应的图像数据处理,比如图像要扩展维度,比如扩展成(batch_size,channels,height,width)
im=np.expand_dims(im,axis=0) |
绘制几何图形
# 绘制直线 |
图像的加法
cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。
两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。
# 注意:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。 |
图像加法:
import numpy as np |
图像的混合
# 这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下: |
图像处理
图像滤波
import cv2 |
视频功能
视频中最常用的就是从视频设备采集图片或者视频,或者读取视频文件并从中采样。所以比较重要的也是两个模块:
- 一个是
VideoCapture
,用于获取相机设备并捕获图像和视频,或是从文件中捕获。 - 还有一个
VideoWriter
,用于生成视频。
来看例子理解这两个功能的用法,首先是一个制作延时摄影视频的小例子:import cv2
import time
interval = 60 # 捕获图像的间隔,单位:秒
num_frames = 500 # 捕获图像的总帧数
out_fps = 24 # 输出文件的帧率
# VideoCapture(0)表示打开默认的相机
cap = cv2.VideoCapture(0)
# 获取捕获的分辨率
size =(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 设置要保存视频的编码,分辨率和帧率
video = cv2.VideoWriter(
"time_lapse.avi",
cv2.VideoWriter_fourcc('M','P','4','2'),
out_fps,
size
)
# 对于一些低画质的摄像头,前面的帧可能不稳定,略过
for i in range(42):
cap.read()
# 开始捕获,通过read()函数获取捕获的帧
try:
for i in range(num_frames):
_, frame = cap.read()
video.write(frame)
# 如果希望把每一帧也存成文件,比如制作GIF,则取消下面的注释
# filename = '{:0>6d}.png'.format(i)
# cv2.imwrite(filename, frame)
print('Frame {} is captured.'.format(i))
time.sleep(interval)
except KeyboardInterrupt:
# 提前停止捕获
print('Stopped! {}/{} frames captured!'.format(i, num_frames))
# 释放资源并写入视频文件
video.release()
cap.release()
人脸检测:
import cv2 |
….功能太多了…以后慢慢发现吧……