一、OpenCV 简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它包含大量优化算法,涵盖图像处理、物体检测、人脸识别、3D重建等任务。支持多种编程语言(如C++、Python、Java),并可在Windows、Linux、macOS等平台上运行。
二、核心功能
-
图像处理:滤波、边缘检测、色彩空间转换(如RGB转灰度)。
-
视频分析:运动检测、背景减除、光流计算。
-
物体检测:Haar级联、YOLO、SSD等算法实现。
-
机器学习:集成SVM、KNN等分类器,支持模型训练与预测。
-
相机标定:用于3D视觉的相机参数校准和立体匹配。
三、安装相关库
opencv-python==3.4.18.65
opencv-contrib-python==3.4.18.65(包含了其他一些图像处理算法函数的opencv扩展库)
四、Opencv操作
导入opencv
在python中Opencv用cv2来表示
以下代码均需要在开头引用
python
import cv2
图片读取
python
a=cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
cv2.imshow('tu',a)
b =cv2.waitKey(0)
print(b)
cv2.destroyAllWindows()
print("图像形状 (shape):",a.shape)#高、宽、通道数
print("图像数据类型(dtype):",a.dtype)#无符号8位整数,用于表示像素值的范围在 0到255之间。
print("图像大小(size):",a.size)
运行结果:


就可以读取图片和图片的相应数据
图片转化为灰度图
python
b=cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp",cv2.IMREAD_GRAYSCALE)
cv2.imshow('xx',b)
a =cv2.waitKey(0)
cv2.destroyAllWindows()
print("图像形状 (shape):",b.shape)#高、宽、通道数
print("图像数据类型(dtype):",b.dtype)#无符号8位整数,用于表示像素值的范围在 0到255之间。
print("图像大小(size):",b.size)
cv2.imwrite('IRON MAN_Gary.jpg',b)
运行结果:


因为灰度图是单通道,彩色图片是三通道,所以灰度图的图像的大小是原图图像大小的三分之一
图片的切片
就是在原图的基础上,选取你所框选区域内的图片
python
a=cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
b=a[30:230,100:300]
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:

视频读取
打开视频文件
python
video_capture = cv2.VideoCapture(r"D:\KuGou\周杰伦 - 晴天.mkv") # 摄像头:0#检查视频是否成功打开
if not video_capture.isOpened():
print("无法打开视频文件")
exit()
循环读取视频帧
python
while True:
ret, frame = video_capture.read()#ret是布尔值,表示是否成功读取了帧,frame 是读取到的帧#检查是否成功读取帧
if not ret:
break
将图像从一种颜色空间转换为另一种颜色空间。
(在此可添加各种对图片的处理步骤已达到对视频处理的效果)
python
frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 显示当前帧
cv2.imshow('Video', frame)
检查用户是否按下"esc'键,如果是则退出循环
python
if cv2.waitKey(60) == 27:
break# 释放资源
这里规定了waitKey == 27就表示按下ASCLL码值为27(ESC键)才能退出播放
以下是完整代码,防止格式错误
python
import cv2
#打开视频文件
video_capture = cv2.VideoCapture(r"D:\KuGou\周杰伦 - 晴天.mkv") # 摄像头:0#检查视频是否成功打开
if not video_capture.isOpened():
print("无法打开视频文件")
exit()
#循环读取视频帧
while True:
ret, frame = video_capture.read()#ret是布尔值,表示是否成功读取了帧,frame 是读取到的帧#检查是否成功读取帧
if not ret:
break
#将图像从一种颜色空问转换为另一种颜色空间。(在此可添加各种对图片的处理步骤已达到对视频处理的效果)
frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 显示当前帧
cv2.imshow('Video', frame)
检查用户是否按下"esc'键,如果是则退出循环
if cv2.waitKey(60) == 27:
break# 释放资源
video_capture.release()
cv2.destroyAllWindows()
RGB 颜色通道提取
python
import cv2
#1.读取图像
a = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
#2.提取颜色通道
a1=a[:,:,0]#蓝色通道(B通道)
a2=a[:,:,1]#绿色通道(G通道)
a3=a[:,:,2]
b, g, r= cv2.split(a)
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('r',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:

**注意:**我们这里是显示R,G,B三通道的图像,但是所显示的图片是灰色的,那是因为只显示单个通道时, 实际上是将相应通道作为亮度值,是单个通道,这会导致图像呈现为灰色。
那怎么才能显示相应通道的颜色呢?(以显示蓝色为例)
想要展示只包含蓝色通道信息的彩色图像,可以将图像中的绿色通道和红色通道设为0,蓝色通道不变,即移除绿色和红色,只保留蓝色。
代码如下:
python
a = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
a_new = a.copy()
a_new[:,:,1]=0 #绿色通道设为0
a_new[:,:,2]=0#红色通道设为0
#创建一个窗口来显示修改后的图像,并将其命名为'result'
cv2.imshow('result2', a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.merge((b, g, r))
cv2.imshow('result3', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:

注意:在opencv中,颜色通道是反着的,RGB在代码中的顺序是BGR
-
a1 = a[:, :, 0] # 蓝色通道(B通道)
-
a2 = a[:, :, 1] # 绿色通道(G通道)
-
a3 = a[:, :, 2] # 红色通道(R通道)
需要显示什么颜色通道,就令其他通道=0
合并颜色
python
# '''合并颜色通道'''
# 1. 读取图像
a = cv2.imread('img.png')
# 2. 提取颜色通道
a1 = a[:, :, 0] # 蓝色通道(B通道)
a2 = a[:, :, 1] # 绿色通道(G通道)
a3 = a[:, :, 2] # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道 g 包含绿色通道 r 包含红色通道
# 使用cv2.merge()函数将三个通道重新合并成一个图像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) #或者使用这行代码
cv2.imshow('result3', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片打码
python
a = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
a[100:200,200:300] = np.random.randint(0,256,(100,100,3))#矩阵赋t值必须是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()
运行结果:

矩阵赋t值必须是相同大小
图片组合
这里可以将图片的部分组合起来
python
a = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
b = cv2.imread(r"C:\Users\LEGION\Desktop\iron.jpg")
b[200:350,200:350]=a[50:200,100:250]#注意:矩阵的大小必须要统一。
cv2.imshow('b',b)
cv2.imshow('a',a)
cv2.waitKey(100000)
cv2.destroyAllWindows()
运行结果:

注意:矩阵大小必须要统一
图片缩放
可以改变图片的长宽
python
a = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
#a_new = cv2.resize(a,(600,200)) #宽、高
a_new = cv2.resize(a,dsize=None,fx=1.5,fy=0.5)
cv2.imshow('a',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
原图:

修改后的图:
