计算机视觉——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()

运行结果:

原图:

修改后的图:

相关推荐
NAGNIP16 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab18 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab18 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP21 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年21 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼1 天前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS1 天前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区1 天前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈1 天前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang1 天前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx