Opencv计算机视觉

注:整个博客中出现的文件,都要修改成自己电脑中所要查看的图片或视频的路径

一、计算机视觉

定义

计算机视觉 是研究如何让计算机从数字图像或视频中自动获取、处理、分析和理解信息 的学科,旨在使计算机能够模拟人类视觉系统的功能,从视觉输入中提取有意义的信息并做出决策。

安装库

需要安装 opencv-python==3.4.18.65 opencv-contrib-python==3.4.18.65

直接在终端pip install即可

二、核心图像操作

1. imread()

  • 功能:读取图像文件

  • 参数:(路径, 读取模式)

  • 模式:彩色(1)、灰度(0)、包含Alpha(-1)

  • 用法

    python 复制代码
    # 基本用法
    img = cv2.imread('image.jpg')  # 默认彩色
    img = cv2.imread('image.jpg', cv2.IMREAD_COLOR)  # 彩色
    img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)  # 灰度
    img = cv2.imread('image.jpg', cv2.IMREAD_UNCHANGED)  # 包含Alpha通道
    
    # 或使用数字
    img = cv2.imread('image.jpg', 1)  # 彩色
    img = cv2.imread('image.jpg', 0)  # 灰度
    img = cv2.imread('image.jpg', -1)  # 包含Alpha

2. imshow()

  • 功能:显示图像窗口

  • 参数:(窗口标题, 图像矩阵)

  • 注意:需配合waitKey()使用

  • 用法

    python 复制代码
    # 显示单张图像
    cv2.imshow('Image Window', img)
    
    # 显示多张图像
    cv2.imshow('Image 1', img1)
    cv2.imshow('Image 2', img2)

3. imwrite()

  • 功能:保存图像文件

  • 参数:(保存路径, 图像矩阵, 可选参数)

  • 支持:多种格式(jpg/png/tiff等)

  • 用法

    python 复制代码
    # 基本保存
    cv2.imwrite('output.jpg', img)
    cv2.imwrite('output.png', img)
    
    # 带参数保存
    # JPEG质量参数
    cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 90])
    
    # PNG压缩参数
    cv2.imwrite('output.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 8])
    
    # 同时设置多个参数
    params = [cv2.IMWRITE_JPEG_QUALITY, 95, cv2.IMWRITE_JPEG_PROGRESSIVE, 1]
    cv2.imwrite('high_quality.jpg', img, params)

4. waitKey()

  • 功能:等待键盘输入

  • 参数:(延迟毫秒数,0=无限等待)

  • 返回:按键ASCII码

  • 用法

    python 复制代码
    # 基本用法
    cv2.waitKey(0)  # 无限等待
    cv2.waitKey(1000)  # 等待1秒
    
    # 常用模式
    while True:
        # 显示视频帧
        cv2.imshow('Video', frame)
        
        # 检测按键
        key = cv2.waitKey(1) & 0xFF
        
        if key == ord('q'):  # 按q退出
            break
        elif key == 27:  # ESC键
            break
        elif key == ord('s'):  # 按s保存
            cv2.imwrite('screenshot.jpg', frame)

5. resize()

  • 功能:调整图像尺寸

  • 参数:(原图, 目标尺寸, 插值方法)

  • 常用插值:INTER_LINEAR/INTER_NEAREST/INTER_AREA

  • 用法

    python 复制代码
    # 方法1:直接指定尺寸
    resized = cv2.resize(img, (640, 480))
    
    # 方法2:使用fx, fy缩放因子
    resized = cv2.resize(img, None, fx=0.5, fy=0.5)  # 缩小一半
    
    # 方法3:指定插值方法
    # 最近邻插值(速度快,质量低)
    resized1 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_NEAREST)
    
    # 双线性插值(平衡,默认)
    resized2 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_LINEAR)
    
    # 区域插值(适合缩小)
    resized3 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_AREA)
    
    # 双三次插值(质量高,速度慢)
    resized4 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_CUBIC)

三、窗口控制

6. destroyAllWindows()

  • 功能:关闭所有窗口

  • 无参数

四、实用功能

7. cvtColor()

  • 功能:颜色空间转换

  • 常用:BGR2GRAY/BGR2RGB/BGR2HSV

  • 用法

    python 复制代码
    # BGR转灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # BGR转RGB
    rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # BGR转HSV
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
    # HSV转BGR
    bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    
    # 灰度转BGR
    bgr_from_gray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)

8. split()/merge()

  • 功能:通道分离/合并

  • split:分离BGR通道

  • merge:合并通道

  • 用法

    python 复制代码
    # 分离BGR通道
    b, g, r = cv2.split(img)
    
    # 分别显示各通道
    zeros = np.zeros(img.shape[:2], dtype="uint8")
    cv2.imshow("Blue", cv2.merge([b, zeros, zeros]))
    cv2.imshow("Green", cv2.merge([zeros, g, zeros]))
    cv2.imshow("Red", cv2.merge([zeros, zeros, r]))
    
    # 合并通道
    merged = cv2.merge([b, g, r])

五、图像信息

9. shape属性

  • 功能:获取图像维度

  • 格式:(高度, 宽度, 通道数)

10. dtype属性

  • 功能:获取数据类型

  • 通常:uint8

六、视频相关

11. VideoCapture()

  • 功能:打开视频/摄像头

  • 参数:(设备索引或视频路径)

  • 用法

    python 复制代码
    # 从摄像头读取
    cap = cv2.VideoCapture(0)  # 0表示默认摄像头
    
    # 从视频文件读取
    cap = cv2.VideoCapture('video.mp4')
    
    while cap.isOpened():
        ret, frame = cap.read()  # ret:是否成功, frame:帧数据
        
        if not ret:
            break
        
        cv2.imshow('Video', frame)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    cap.release()

12. VideoWriter()

  • 功能:保存视频

  • 参数:(输出路径, 编码, 帧率, 分辨率)

  • 用法

    python 复制代码
    # 设置视频参数
    fps = 30.0
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
    # 创建VideoWriter对象
    fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 编码格式
    out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
    
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        
        out.write(frame)  # 写入帧
        
        cv2.imshow('Recording', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    out.release()

七、数学运算

13. add()/subtract()

  • 功能:图像加减运算

14. addWeighted()

  • 功能:图像加权融合

  • 实现:dst = α·img1 + β·img2 + γ

八、用法示例

1、读取图片

python 复制代码
'''读取图片'''
import cv2
a = cv2.imread('true.png')
# print(a)
cv2.imshow('true', a)
b = cv2.waitKey(0)
# print(b)
cv2.destroyAllWindows()
print("图像形状 (shape):",a.shape)
print("图像数据类型 (dtype):",a.dtype)
print("图像大小(size):",a.size)

2、读取图片的灰度图

python 复制代码
'''读取图片的灰度图'''
import cv2
b = cv2.imread('true.png',cv2.IMREAD_GRAYSCALE)
# print(b)
cv2.imshow('tr', b)
c = cv2.waitKey(0)
print(c)
cv2.destroyAllWindows()
print("图像形状 (shape):",b.shape)
print("图像数据类型 (dtype):",b.dtype)
print("图像大小(size):",b.size)

# 图片保存
cv2.imwrite('true_GRAY.png',b)

3、读取视频

python 复制代码
'''视频'''
import cv2
video_capture = cv2.VideoCapture("视频.mp4")#摄像头0
if not video_capture.isOpened():
    print("无法打开视频文件")
    exit()
#循环读取视频帧
while True:
    ret, frame = video_capture.read()
    if not ret:
        break
#灰度
    frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#显示当前帧
    cv2.imshow("video",frame)
#检查用户是否按下'Esc'键,如果是则退出循环,esc=27,空格是32
    if cv2.waitKey(60)==27:#这里的60指的是60ms,当是0时会卡在第一帧画面,想要得到下一帧要按下任意键
        break
#释放资源
video_capture.release()#将前面加载的文件释放出去
cv2.destroyAllWindows()

在这个代码里可以通过修改waitKey()括号中的数字来控制视频播放的速度

当前代码显示的是灰度的视频,若想显示彩色的,可以将

复制代码
frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

这一行删去或注释掉,若想修改成其他的,也可以通过上面提到的cvtColor的一些用法改变

4、对图片进行切片

python 复制代码
'''对图片进行切片'''
'''ROI:区域感兴趣(Region of Interest)的缩写。它指的是图像或视频中感兴趣的特定区域,需要进行分析或处理。
#ROI可以由用户手动选择,也可以使用计算机视觉算法自动检测。'''
import cv2
a = cv2.imread(r'./true.png')
b = a[20:220,30:230]# 直接对numpy 数组进行切片
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、提取rgb颜色通道

1)将三个通道都分离

python 复制代码
import cv2
ai=cv2.imread(r'./xiaomao.jpg')
a = cv2.resize(ai,dsize=None,fx=0.3,fy=0.3)
#提取颜色通道
a1=a[:,:,0]#蓝色通道
a2=a[:,:,1]#绿色通道
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()

2)将一个通道或两个通道修改为0(即删除某个通道)

下面代码中我将绿色和蓝色通道都设为0,所有显示的图片是全蓝的

python 复制代码
import cv2
ai=cv2.imread(r'./xiaomao.jpg')
a = cv2.resize(ai,dsize=None,fx=0.3,fy=0.3)

a_new=a.copy()
# a_new[:,:,0]=0#将蓝色设置为0
a_new[:,:,1]=0#将绿色设置为0
a_new[:,:,2]=0#将红色设置为0
cv2.imshow('a_new',a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
相关推荐
aopstudio2 小时前
ASR概念和术语学习指南(2):传统 ASR 系统的工作流程
人工智能·语音识别·asr
雅欣鱼子酱2 小时前
ECP5702 PD诱骗协议芯片,单芯片取电5V~20V输出给后端充电模板!
网络·人工智能·芯片·电子元器件
还不秃顶的计科生2 小时前
LeetCode 热题 100第一题:两数之和python版本
python·算法·leetcode
司南OpenCompass2 小时前
司南“六位一体”评测体系的一年演进
人工智能·大模型·多模态模型·大模型评测·司南评测·ai评测
大模型任我行2 小时前
电信:Agent记忆管理决策理论框架DAM
人工智能·语言模型·自然语言处理·论文笔记
学习3人组2 小时前
目标检测训练常见问题排查清单
人工智能·目标检测·计算机视觉
Coder_Boy_2 小时前
基于SpringAI的智能AIOps项目:微服务与DDD多模块融合设计概述
java·运维·人工智能·微服务·faiss
2401_841495642 小时前
【Python高级编程】2026 丙午马年元旦祝福程序
python·动画·tkinter·程序·pyinstaller·元旦·turtle
该醒醒了~2 小时前
使用auto-py-to-exe打包python程序exe并添加图标和ico文件
python