一、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来表示

以下代码均需要在开头引用

import cv2

图片读取

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)

运行结果:

就可以读取图片和图片的相应数据

图片转化为灰度图

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)

运行结果:

因为灰度图是单通道,彩色图片是三通道,所以灰度图的图像的大小是原图图像大小的三分之一

图片的切片

就是在原图的基础上,选取你所框选区域内的图片

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()

运行结果:

视频读取

打开视频文件

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# 释放资源

这里规定了waitKey == 27就表示按下ASCLL码值为27(ESC键)才能退出播放

以下是完整代码,防止格式错误

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 颜色通道提取

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,蓝色通道不变,即移除绿色和红色,只保留蓝色。

代码如下:

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

  1. a1 = a[:, :, 0] # 蓝色通道(B通道)

  2. a2 = a[:, :, 1] # 绿色通道(G通道)

  3. a3 = a[:, :, 2] # 红色通道(R通道)

需要显示什么颜色通道,就令其他通道=0

合并颜色

# '''合并颜色通道'''
# 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()

图片打码

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值必须是相同大小

图片组合

这里可以将图片的部分组合起来

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()

运行结果:

注意:矩阵大小必须要统一

图片缩放

可以改变图片的长宽

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()

运行结果:

原图:

修改后的图:

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐