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()
相关推荐
喵手几秒前
Python爬虫零基础入门【第二章:网页基础·第2节】你要抓的到底是什么:HTML、CSS 选择器、XPath 入门?
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·网页基础·网页结构解析
ZCXZ12385296a1 分钟前
【深度学习实战】基于YOLO11-ConvNeXtV2的软垫物体检测与分类详解
人工智能·深度学习·分类
飞天小蜈蚣2 分钟前
python-django_ORM的十三个查询API接口
开发语言·python·django
wfeqhfxz25887823 分钟前
花椒种植环境中的异物检测与分类:基于QueryInst模型的10类杂质识别
人工智能·分类·数据挖掘
人工智能AI技术9 分钟前
【Agent从入门到实践】18 脚本化编程:批量执行、自动化逻辑
人工智能·python
摘星编程11 分钟前
React Native + OpenHarmony:MapView自定义标注样式
python
向量引擎15 分钟前
[硬核架构] 2026 企业级 AI 网关落地指南:从“连接超时”到“秒级响应”的架构演进(附 Python/Java 源码)
人工智能·python·gpt·ai作画·架构·aigc·api调用
0思必得016 分钟前
[Web自动化] Selenium模拟用户的常见操作
前端·python·selenium·自动化
Aloudata19 分钟前
数据语义层 vs 宽表模式:哪种架构更适合 AI 时代的数据分析?
人工智能·架构·数据挖掘·数据分析·数据治理
前进的李工19 分钟前
深度解析:词向量与自注意力机制
深度学习·神经网络·cnn·位置编码·自注意力