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()
相关推荐
Java后端的Ai之路4 小时前
【Python 教程15】-Python和Web
python
那个村的李富贵4 小时前
光影魔术师:CANN加速实时图像风格迁移,让每张照片秒变大师画作
人工智能·aigc·cann
冬奇Lab6 小时前
一天一个开源项目(第15篇):MapToPoster - 用代码将城市地图转换为精美的海报设计
python·开源
腾讯云开发者6 小时前
“痛点”到“通点”!一份让 AI 真正落地产生真金白银的实战指南
人工智能
CareyWYR6 小时前
每周AI论文速递(260202-260206)
人工智能
hopsky7 小时前
大模型生成PPT的技术原理
人工智能
禁默7 小时前
打通 AI 与信号处理的“任督二脉”:Ascend SIP Boost 加速库深度实战
人工智能·信号处理·cann
心疼你的一切8 小时前
昇腾CANN实战落地:从智慧城市到AIGC,解锁五大行业AI应用的算力密码
数据仓库·人工智能·深度学习·aigc·智慧城市·cann
AI绘画哇哒哒8 小时前
【干货收藏】深度解析AI Agent框架:设计原理+主流选型+项目实操,一站式学习指南
人工智能·学习·ai·程序员·大模型·产品经理·转行
数据分析能量站8 小时前
Clawdbot(现名Moltbot)-现状分析
人工智能