计算机视觉——Opencv(基础操作一)

一、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

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

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

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

运行结果:

原图:

修改后的图:

相关推荐
玄微云4 小时前
当暖心服务遇见硬核AI:玄微子AI让孕产关怀更有温度
大数据·人工智能·科技·物联网·产康门店
Warren2Lynch4 小时前
AI赋能企业架构:TOGAF智能建模新时代
人工智能·架构
机器学习之心4 小时前
MATLAB基于近红外光谱检测的菠萝含水率预测(多种预处理+PLS)
人工智能·算法·matlab·近红外光谱检测
sunxunyong4 小时前
openwork实测
人工智能
isNotNullX4 小时前
什么是可信数据空间?为什么可信数据空间是数据共享的关键?
大数据·人工智能·数据安全·数据空间
星爷AG I4 小时前
9-1 视觉通路(AGI基础理论)
人工智能·agi
Ro Jace4 小时前
读文献到什么程度才能解决问题以及撰写论文?
人工智能·雷达信号分选
weixin_307779134 小时前
面向通用矩阵乘法(GEMM)负载的GPU建模方法:原理、实现与多场景应用价值
运维·人工智能·线性代数·矩阵·gpu算力
2301_780789664 小时前
2025年UDP洪水攻击防护实战全解析:从T级流量清洗到AI智能防御
服务器·网络·人工智能·网络协议·安全·web安全·udp