OpenCV简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库。它包含超过2500种优化算法,涵盖图像处理、物体识别、人脸检测、3D重建、视频分析等任务。
核心功能
- 图像处理:滤波、边缘检测、几何变换。
- 视频分析:运动估计、背景减除。
- 物体检测:人脸、行人、文本等。
- 相机标定:3D重建、AR应用。
- 机器学习:SVM、KNN、神经网络等集成。
下载与安装
Python环境安装
通过pip直接安装:
pip install opencv-python # 仅核心模块
pip install opencv-contrib-python # 包含额外模块
资源推荐
- 官方文档:docs.opencv.org
- GitHub仓库:github.com/opencv/opencv
- 教程:OpenCV官方提供的Python和C++示例代码。
基础功能
1 读取图片
import cv2
import numpy as np
a=cv2.imread('test.png')
cv2.imshow('tu',a)
print(a.shape)
print(a.size)
print(a.dtype)
b=cv2.waitKey(0)
# cv2.destroyAllWindows()
这里线导入了opencv的库CV2,读取了一张图片,这里我们读取后的数据为(*,*,3),因为默认读取的是RGB三个通道的。然后cv2.show()可以展示图片,cv2.waitKey(0)表示停留时间,如果参数为0,表示一直停留,如果是其他表示停留n毫秒。cv2.destroyAllWindows()表示关闭所有界面
2 转化灰度图和保存
import cv2
import numpy as np
# a=cv2.imread('test.png',cv2.IMREAD_GRAYSCALE)
# a=cv2.imread('test.png',0)#等效
a=cv2.imread('test.png')
a=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow('tu',a)
cv2.waitKey(0)
cv2.destroyAllWindows()
#图片保存
cv2.imwrite('test0.jpg',a)
这里采用了三种方法来转化灰度图,前两种都是在读取的同时就转化为灰度图了,第一种用cv2.IMREAD_GRAYSCALE来直接转换,其实吧这个替换为0也是同样效果。还有一种是用cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)来转的。最后可以用cv2.imwrite('test0.jpg',a)来保存。
3 抠图
#抠图
import cv2
import numpy as np
a=cv2.imread('test.png')#等效b=a[100:300,280:500]
cv2.imshow('b',b)
cv2.imshow('tu',a)
cv2.waitKey(0)
#图片保存
cv2.imwrite('test0.jpg',a)
这里就像数组一样,可以进行切片。然后选取我们要选中的区域
我们可以这样理解图片,图片是由一个一个像素组成的,cv2库把像素点量化了(0-255)。通过cv2,我们可以把一组数组转化为图片,也可以把图片转化为数组。所有我们可以选中一块区域来转化为图片。
4 读取视频
#读取视频
import cv2
import numpy as np
video=cv2.VideoCapture('test.mp4')
# video=cv2.VideoCapture(0) #0表示打开摄像头
if not video.isOpened(): #判断是否打开print("视频打开失败")
while True:ret,frame=video.read() #ret表示是否读取到下一帧,用于终止画面的if not ret:break# frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #把图像转化为黑白的cv2.imshow('frame',frame)if cv2.waitKey(30) == 27: #27为esc的ASCII码,只有esc才能退出breakvideo.release()
cv2.destroyAllWindows()
我们用cv2.VideoCapture('test.mp4')来读取一个视频,然后判断是否打开了(防止意外发生),然后如果打开了就进入一个循环,就是读取视频的每一帧,然后如果存在这里ret就为True
:帧读取成功,可继续处理,否则就停止了。然后对这一帧进行展示,然后下面cv2.waitKey()中填参数来控制速度越大就会播放的速度。最后要对视频资源进行释放,否则如果视频资源太多会卡顿。
5 提取RGB通道
提取RGB通道
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
a1=a[:,:,0]
a2=a[:,:,1]
a3=a[:,:,2]
cv2.imshow('Red Channel (Grayscale)', a2)
cv2.waitKey(0)b,g,r=cv2.split(a)
cv2.imshow('a',a)
cv2.imshow('g',g)
cv2.imshow('b',b)
cv2.imshow('r',r)
cv2.waitKey(0)a_new=a.copy()
a_new[:,:,0]=0
a_new[:,:,1]=0
# a_new[:,:,2]=0
cv2.imshow('Red',a_new)
cv2.waitKey(0)b,g,r=cv2.split(a)
cv2.imshow('a',a)cv2.imshow('g',g)
cv2.imshow('b',b)
cv2.imshow('r',r)n=cv2.merge([b,g,r])
cv2.imshow('new',n)
cv2.waitKey(0)
上面提供了三种提供RGB的方式,但是如果我们展示单通道的时候会自动转化为灰白的图片,只有当我们将其与两种设为0,这样才会展现出。(RGB顺序和RGB不一样,他是以BGR顺序存在的)
6 图片打码
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
a[100:300,280:500]=np.random.randint(0,255,(200,220,3))
cv2.imshow('a',a)
cv2.waitKey(0)
还是和上面说的一样,图片由像素表示,像素由数字控制大小,如果我们把指定区域的数字取随机数,那么这块就相当于打码了
7 图片组合
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
b=cv2.imread('img.png')
a[100:300,280:500]=b[100:300,200:420]
cv2.imshow('a',a)
cv2.waitKey(0)
这个就是把像素的一块,替换为另一张图片的一块,和上面图片打码的核心是差不多的。值得注意的是,这里两张图片取的大小要对应。
8 图片缩放
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
cv2.imshow('a',a)
# b=cv2.resize(a,(300,300))
b=cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
cv2.imshow('b',b)
cv2.waitKey(0)
这里由两种方法,虽然都是用resize,但一个 是直接给出你要放大或缩小到多少像素大小,另一种是要横向x和纵向y要放大或缩小多少倍
总结
OpenCV是一个开源的计算机视觉库,提供2500多种优化算法,支持图像处理、视频分析、物体检测等任务。摘要介绍了OpenCV的基础功能:1)读取和显示图片;2)灰度图转换与保存;3)图像区域裁剪;4)视频读取与处理;5)RGB通道分离与合并;6)图像打码处理;7)图像组合;8)图像缩放。这些功能展示了OpenCV如何通过像素级操作实现基础图像处理,为更复杂的计算机视觉应用奠定基础。