文章目录
OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。
一、核心功能
OpenCV提供了丰富的功能,包括但不限于以下几个方面:
- 图像处理:包括图像加载、保存、调整大小、旋转、裁剪、滤波、边缘检测等。OpenCV提供了多种图像滤波器,如模糊、高斯模糊、Canny边缘检测器等。
- 物体检测与跟踪:OpenCV提供了多种目标检测和跟踪算法,如Haar级联检测器、HOG特征检测器、卡尔曼滤波器等,这些算法可以用于人脸检测、行人检测、车牌识别等应用。
- 特征提取与匹配:包括角点检测、描述符提取、特征匹配等,这些功能有助于从图像中提取关键信息并进行比较和分析。
- 机器学习:OpenCV集成了分类、聚类、回归等机器学习算法,可以方便地进行模式识别和数据挖掘。
- 深度学习:OpenCV提供了与主流深度学习框架(如TensorFlow、PyTorch)的集成接口,支持神经网络模型的训练和推断。
- 视频分析:包括视频捕捉、视频处理、目标跟踪、视频稳定等功能,适用于监控和安全等应用。
二、初识OpenCV
本篇所用数据:
链接: <数据>
提取码: dzvx
1. 安装OpenCV
pip install opencv
2. 读取图片
import cv2
a = cv2.imread('GGbond.jpg') #读取图片信息,返回三维数组
cv2.imshow('pig',a) #显示图片
b = cv2.waitKey(10000) #图片显示等待时间
print(b) #返回关闭图片时,点击的按钮对应的ACCII码值
cv2.destroyAllWindows() #关闭所有窗口
print("图片形状:",a.shape)
print("图片数据类型:",a.dtype)
print("图片大小:",a.size)
---------------------------
27
图片形状: (1070, 1080, 3)
图片数据类型: uint8
图片大小: 3466800
3. 读取灰度图
将彩色图片转化为灰度图
b = cv2.imread('GGbond.jpg',cv2.IMREAD_GRAYSCALE) #或者将cv2.IMREAD_GRAYSCALE用0代替,也可以加载灰度图
print(b)
cv2.imshow('pig_gary',b) #展示图片,可以给展示的图片命名
a = cv2.waitKey(0) #cv2.waitKey设置参数为0时,表示图片一直展示,知道主动关闭
cv2.destroyAllWindows()
print("图片形状:",b.shape)
print("图片数据类型:",b.dtype)
print("图片大小:",b.size)
---------------------
[[230 235 240 ... 239 239 239]
[230 235 240 ... 240 239 239]
[230 235 240 ... 240 240 240]
...
[227 231 236 ... 240 240 240]
[227 231 236 ... 240 240 240]
[227 231 236 ... 240 240 240]]
图片形状: (1070, 1080)
图片数据类型: uint8
图片大小: 1155600
4. 图片保存
#图片保存
cv2.imwrite('GGbond_gary.jpg',b)
5. 视频文件读取
此处注意哦,视频的读取实则本质上是读取视频中每一帧的图片,通过将下一张图片覆盖上一张,形成视频的效果:
#打开视频文件
video_capture = cv2.VideoCapture('video.mp4') #仅输入参数0,可以打开摄像头
if not video_capture.isOpened():
print("无法打开视频文件")
exit()
#每次读取的都是一帧画面,通过循环,将下一帧的画面覆盖上一个画面,形成视频效果
while True:
ret,frame = video_capture.read() #读取每一帧画面
if not ret:
break
new_frame = cv2.resize(frame,dsize=None,fx=0.5,fy=0.5) #改变视频显示大小
new_frame = cv2.cvtColor(new_frame,cv2.COLOR_BGR2GRAY) #将每一帧转化为灰度图
cv2.imshow('Video',new_frame) #展示每一帧的画面
if cv2.waitKey(30) == 27: #按下esc键,结束循环
break
#释放资源:每次读取视频时,每一帧画面占据内存,及时释放清理
video_capture.release()
cv2.destroyAllWindows()
6. 区域截取
截取指定区域的图片:
a = cv2.imread('GGbond.jpg')
b = a[300:800,300:800] #【垂直方向多少行,水平方向多少列】
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(10000)
cv2.destroyAllWindows()
7. 提取RGB通道颜色
特别注意!!!opencv在处理图片时,颜色顺序为BGR!!
我们知道,在读取一个图片时,返回的是一个三位数组,而其中的第三个通道代表的就是颜色,所以我们获取RGB时,可通过一下方法获取:
#opencv处理颜色数据顺序为BGR
a = cv2.imread('GGbond.jpg')
#提取颜色通道
a1 = a[:,:,0] #提取B通道
a2 = a[:,:,1] #提取G通道
a3 = a[:,:,2] #提取R通道
或者通过split方法分离颜色通道:
#或通过split方法分离颜色通道
b,g,r = cv2.split(a)
提取通道后我们来看看提取后的图片,以蓝色为例:
cv2.imshow('result',b) #展示蓝色通道
#但是显示结果时,显示的是灰度图,因为其它两个通道默认值为255,所以需要手动调整值
cv2.waitKey(10000)
cv2.destroyAllWindows()
我们发现,显示的是灰度图,因为其它两个通道默认值为255,所以需要手动调整值:
手动调整通道颜色:
#调整通道颜色的值
a_new = a.copy() #复制一个图片,不在原图上操作
#将G,R通道的颜色值,调整为0
a_new[:,:,1] = 0
a_new[:,:,2] = 0
cv2.imshow('result_1',a_new)
cv2.waitKey(10000)
cv2.destroyAllWindows()
8. 合并颜色通道
我们知道,图片是由一个个像素点组成的,通过每个像素点颜色的不同,凸显形成一个有形状的图片,所以,我们将颜色拼接,即可得到我们想要的图片,使用merge()函数合并:
a = cv2.imread('GGbond.jpg')
#提取颜色通道
a1 = a[:,:,0]
a2 = a[:,:,1]
a3 = a[:,:,2]
#或
b,g,r = cv2.split(a)
#使用merge()函数将三个通道合并成一个图像
img = cv2.merge((b,g,r))
cv2.imshow('result',img)
cv2.waitKey(10000)
cv2.destroyAllWindows()
总结
本篇介绍了:
- OpenCV的功能作用
- opencv的部分基本作用:读取图片、读取灰度图、图片保存、视频文件读取、区域截取、提取RGB通道颜色、合并颜色通道
- 发现了嘛? 我们本篇学习用的图片很大,怎么将它缩小一点呐?改变它的形状,我们下篇再见哦~