当前位置: 首页 > news >正文

【图像认知与处理】OpenCV基础学习

目录

一、前言概括

1.1 前言部分

1.2 “三大库”部分

1.2.1 概念介绍

(1)NumPy

(2)Pandas

(3)Matplotlib

1.2.2 三大库协同

二、OpenCV 初识

2.1 OpenCV介绍

2.1.1 概念

2.1.2 优势

2.2 OpenCV - Python

2.2.1 概念介绍

2.2.2 详细说明

2.2.3 应用场景

三、基础知识学习

3.1 安装OpenCV - Python

(1)第一步

(2)第二步

(3)第三步

3.2 关于图像表示

3.2.1 像素是图像的基本单元

3.2.2 关于8位数图像

3.2.3 关于RGB三原色

3.3 图像存储

3.3.1 图像与矩阵

3.3.2 形状 Shape

3.3.3 数据类型 dtype

3.3.4 彩色图像

四、代码实践部分

4.1 基本图像操作

4.1.1 创建窗体

4.1.2 读取图像

4.1.3 显示图像

4.1.4 保存图像

4.1.5 典例分析

4.2 进阶操作

4.2.1 全黑全白图像

4.2.2 图像切片(裁剪)

(1)概念部分

(2)代码示例

(3)注意点

4.2.3 图片缩放

4.3 图像绘制部分

4.3.1 绘制直线

4.3.2 绘制圆形

4.3.3 绘制矩形

4.3.4 结合使用示例

4.4 关于读取视频

4.4.1 基本步骤

(1)创建VideoCapture对象

(2)逐帧读取视频

(3)释放资源

4.4.2 示例代码


一、前言概括

1.1 前言部分

前面学习完了Python的模块化编程,认识了一些常见的第三方模块,今天来认识一下三大模块,作为基础学习的重要一部分,由于其方法数量众多,因而文章不一一列出,需要读者进行自学,可以在需要用到的时候去查阅官方文档的相关部分或者直接问AI。

Python官方文档:3.12.10 Documentation

OpenCV中文文档:OpenCV中文官方文档

1.2 “三大库”部分

1.2.1 概念介绍

(1)NumPy

“Numerical Python”

核心功能

  • 多维数组对象ndarray):高效存储和处理大型数组,支持向量化运算
  • 数学函数库:线性代数、傅里叶变换、随机数生成等
  • 内存效率:比 Python 列表节省空间,运算速度快数十倍

典型应用

  • 科学计算、机器学习算法的底层数据结构
  • 图像处理中的像素矩阵操作
  • 金融领域的数值模拟
import numpy as np# 创建数组
arr = np.array([[1, 2, 3], [4, 5, 6]])# 向量化运算
result = arr * 2  # 输出: [[2, 4, 6], [8, 10, 12]]# 线性代数
a = np.array([[1, 2], [3, 4]])
b = np.linalg.inv(a)  # 矩阵求逆
(2)Pandas

命名启发

  •  “Panel Data”(面板数据):在统计学和计量经济学中,面板数据是指包含多个实体(如公司、个人)在不同时间点的观测数据,是一种多维结构化数据。Pandas 的设计初衷之一就是高效处理这类数据。
  • “Python Data Analysis”:名字也隐含了库的用途:Pan(Python) + das(Data Analysis),即“Python 数据分析”

核心功能

  • 数据结构Series(一维)和 DataFrame(二维表格)
  • 数据处理:缺失值处理、数据合并、分组聚合
  • 时间序列分析:日期范围生成、频率转换

典型应用

  • 数据清洗与预处理
  • 结构化数据分析(如 Excel 替代方案)
  • 金融数据处理、日志分析
import pandas as pd# 创建DataFrame
data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]}
df = pd.DataFrame(data)# 数据筛选
filtered = df[df['Age'] > 28]  # 输出: Bob行# 分组统计
df.groupby('Name')['Age'].mean()
(3)Matplotlib

 “MATLAB” + “Plot Library”:设计初衷是为 Python 提供一个类似于 MATLAB 的交互式绘图工具,因此名字直接致敬了 MATLAB 的绘图功能。

核心功能

  • 2D/3D 绘图:折线图、散点图、柱状图、热力图等
  • 自定义可视化:支持颜色、标签、标题等个性化设置
  • 子图布局:在同一画布上展示多个图表

典型应用

  • 数据可视化报告
  • 科学研究结果展示
  • 机器学习模型性能分析
import matplotlib.pyplot as plt
import numpy as np# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)# 绘制图表
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='Sin(x)')
plt.title('Sine Wave')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True)
plt.show()

1.2.2 三大库协同

  • NumPy提供底层数组支持,是 Pandas 和 Matplotlib 的基础
  • Pandas基于 NumPy 构建,用于高效数据处理
  • Matplotlib接收 NumPy/Pandas 数据,生成可视化图表

实际项目中,三者常结合使用:

数据获取 → Pandas清洗 → NumPy处理 → Matplotlib可视化

二、OpenCV 初识

2.1 OpenCV介绍

2.1.1 概念

OpenCV(开放源代码计算机视觉库)是一个开源的计算机视觉和机器学习软件库。由一系列 C++ 类和函数构成,用于图像处理、计算机视觉领域的算法实现。

2.1.2 优势

  • 开源免费:完全开源,可以自由使用,降低开发成本和技术门槛。

  • 多语言支持:除C++原生接口外,还支持Java、Python等编程语言。

  • 跨平台:支持多种操作系统,Windows、Linux、ios、Android等,方便开发和部署。

  • 丰富API:完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。

2.2 OpenCV - Python

(本文使用OpenCV - Python进行详细介绍与代码演示,而非原生OpenCV)

2.2.1 概念介绍

OpenCV-Python 是 OpenCV(Open Source Computer Vision Library) 的 Python 接口,它是一个开源的计算机视觉和机器学习库,广泛用于图像处理、视频分析、目标检测、人脸识别、3D 重建等任务。

2.2.2 详细说明

  1. OpenCV-Python是原始OpenCV C++实现的Python包装器。它结合了 OpenCV C++ API 的高性能与 Python 语言的易用性和简洁性。通过 OpenCV-Python,开发者可以轻松地进行图像处理、计算机视觉任务以及机器学习应用。
  2. 与C / C++等语言相比,Python速度较慢。Python可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。
  3. OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。

2.2.3 应用场景

  • 图像处理:滤镜、边缘检测、图像增强。

  • 视频分析:运动跟踪、背景减除。

  • AI 模型部署:与 TensorFlow/PyTorch 结合运行深度学习模型(如 YOLO)。

  • AR/VR:摄像头标定、3D 姿态估计。

  • 工业检测:缺陷识别、自动化测量。

三、基础知识学习

3.1 安装OpenCV - Python

在前面我们安装的学习环境里安装OpenCV - Python,这里复习一下:

(1)第一步

首先搜索并打开Anaconda Prompt,等待base环境出现(一般我们不在base中安装库和模块)。

(2)第二步

切换(激活)到我们所使用的环境,即之前创建过的。

conda activate <环境名>

如果忘了名字可以使用以下代码查看:

conda env list

(3)第三步

安装OpenCV - Python:(这里使用清华源)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

 关于如何换源,可以参考:

https://zhuanlan.zhihu.com/p/623325525?utm_id=0&wd=&eqid=c5c7218f000041ba00000006648852f8

3.2 关于图像表示

3.2.1 像素是图像的基本单元

像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不同,每个像素可以用不同的二进制数表示。

3.2.2 关于8位数图像

计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像。opencv中常用的是8位图像,大多数彩色和灰度图像使用8位表示每个通道的像素值,范围从0到255,其中0 代表最黑,1 表示最白。

3.2.3 关于RGB三原色

日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机中,RGB三种颜色被称为RGB三通道,每个通道的取值都是0-255,根据这三个通道存储的像素值,来对应不同的颜色。

3.3 图像存储

3.3.1 图像与矩阵

在OpenCV中,无论是读取还是创建图像,结果都是一个NumPy数组。图像本质上是像素值的二维或三维矩阵。

  • 彩色图像:三维数组
  • 灰度图像:二维数组

3.3.2 形状 Shape

图像的尺寸由其高(height)、宽(width)和通道数(channels)决定,可简记为(H,W,C)。可以通过 img.shape 属性获取这些信息。

  • 对于彩色图像(如RGB),返回的是一个包含三个值的元组 (height, width, channels)。

  • 对于灰度图像,返回的是一个包含两个值的元组 (height, width),因为灰度图像只有一个通道。

3.3.3 数据类型 dtype

图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(uint8)允许的范围是从0到255。

关于像素表示:

  • 单通道图像(灰度图像):每个像素由一个数值表示,代表该点的亮度。值越低(接近0),颜色越暗;值越高(接近255),颜色越亮。

  • 多通道图像(彩色图像): 在OpenCV中,默认情况下,彩色图像是以BGR(蓝-绿-红)顺序存储

3.3.4 彩色图像

  • 每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。
  • RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量
  • RGB图像的数据类型一般为8位无符号整形(uint8),通常用于表示和存放彩色图像。

四、代码实践部分

4.1 基本图像操作

4.1.1 创建窗体

使用 cv2.namedWindow() 方法创建一个新的窗口。你可以为这个窗口指定一个名称,并且可以选择窗口的属性(例如,是否可调整大小)。

cv2.namedWindow(winname [,窗口属性])

参数:

  • winname:窗口名

  • 窗口属性:窗口大小是否可调整

    • cv2.WINDOW_AUTOSIZE:默认,窗口会根据加载的图像自动调整到合适的大小,并且用户不能拖动窗口边缘来调整窗口大小。

    • cv2.WINDOW_NORMAL:窗口大小是可调整的,用户可以通过鼠标拖动窗口边缘来自由改变窗口大小。

4.1.2 读取图像

cv2.imread(path [,读取方式])

  • 参数:filename 图像路径

  • 读取方式:彩色·默认、灰色(cv.IMREAD_GRAYSCALE)等

4.1.3 显示图像

cv2.imshow(winname,img)

参数:

  • winname:显示图像的窗口名,以字符串类型表示

  • img:要显示的图像

  • cv.waitKey(0):表示无限期地等待任何键盘按键。这种用法常见于图像显示窗口中,确保图像在窗口中显示直到用户决定关闭它。

  • cv.waitKey(n):n>0,意味着程序将等待n毫秒。这种方式常用于视频播放或实时摄像头捕获场景,以便控制每一帧停留的时间,同时允许用户通过按键来中断循环或发出命令。

cv2.destroyAllWindows([winname])

    • cv2.destroyAllWindows():会在当前程序执行到该语句时立即销毁打开的窗口,并释放与这些窗口相关的资源。

    • winname:窗口名,关闭指定名称的窗口。可省略,销毁所有已打开的窗口。

    4.1.4 保存图像

    cv2.imwrite(path,img)

    参数:

    • path:图片保存的路径和图片名

    • img:要保存的图像

    4.1.5 典例分析

    import cv2 as cv# 读取图形 cv.imread(path)
    cat = cv.imread("../images/1.jpg")
    print(cat)
    print(cat.shape)  # (H,W,C) 元组# np.uint8 数据类型为无符号 8 位整数(范围 0~255),这是图像像素的标准类型
    print(cat.dtype)# 显示图像 cv.imshow(windos, img)
    cv.imshow("myimg", cat)# 给图像留下绘制时间 cv.waitKey(n) 等待n毫秒后关闭窗口,0表示一直等待
    cv.waitKey(0)# 释放资源 cv.destroyAllWindows()
    cv.destroyAllWindows()

    4.2 进阶操作

    4.2.1 全黑全白图像

    • 使用np.zeros()创建全黑图像,再修改像素值成为全白图像。
    • numpy.zeros((height,width,channels),dtype=np. uint8)

    4.2.2 图像切片(裁剪)

    (1)概念部分
    • Opencv中,图像切片用于从图像中提取一个子区域(矩形区域)。

    • 假设你有一个图像img,它的类型是numpy.ndarrayimg[y:y+h,x:x+w]的含义如下:

      • x:子区域左上角的x坐标

      • y:子区域左上角的y坐标

      • w:子区域的宽度

      • h:子区域的高度

    • 切片操作

      • img[y:y+h,x:x+w]提取的是从(x,y)开始,高度为h,宽度为w的矩形区域

    (2)代码示例
    • 此处图片文件夹目录与代码文件夹目录在同一父文件夹下。
    • 可以在Windows自带的画图软件中打开图片,一般在左下角可以看到鼠标位置的像素坐标(x,y)
    • 注意切片方法与坐标是反的,以及坐标系以左上角为原点,y轴向下为正方向。
    import cv2 as cv  # 一般都命名为cv
    # import numpy as npcat = cv.imread("../images/1.jpg")
    cv.imshow('cat', cat)# 进行切片 (W,H) (289,231) (368,297)# eye = cat[231:297, 289:368]
    # cv.imshow("dst", eye)
    # cv.waitKey(0)
    # cv.destroyAllWindows()# 211,196  529,458
    h = cat[196:458, 211:529]
    cv.imshow("dst", h)
    cv.waitKey(0)
    cv.destroyAllWindows()
    (3)注意点
    • 边界检查:确保(y,x)(y+h,x+w)都在图像的边界内,否则会出现索引越界错误。

    • 数据类型:img通常是numpy.ndarray类型,切片操作返回的也是numpy.ndarray类型。

    4.2.3 图片缩放

    • cv2.resize是Opencv库中用于调整图像大小的函数,在图像处理中很常用,特别是在要对图像进行缩放以适应不同需求时。

    cv2.resize(img,dsize)

    • img:输入图像,通常是二维或三位NumPy数组。

    • dsize:输出图像的尺寸,是一个二元组(w,h)

    代码示例:

    import cv2 as cv# 读取图像
    cat = cv.imread("../images/1.jpg")
    print(cat.shape)# 调整图像大小,宽在前高在后
    cat2 = cv.resize(cat, (500, 480))# 打印图像大小,shape高在前宽在后,(H,W,C)
    print(cat2.shape)
    cv.imshow("cat2", cat2)cv.imshow("cat", cat)
    cv.waitKey(0)
    cv.destroyAllWindows()

    4.3 图像绘制部分

    4.3.1 绘制直线

    cv2.line(img,sart,end,color,thickness)

    参数

    • img:要绘制直线的图像

    • start、end:直线的起点和终点

    • color:直线的颜色(对于彩色图像,使用 BGR 格式指定颜色)

    • thickness:线条宽度

    4.3.2 绘制圆形

    cv2.circle(img,centerpoint,r,color,thickness)

    参数:

    • img:要绘制圆形的图片

    • centerpoint、r:圆心和半径

    • color:线条颜色

    • tnickness:线条宽度,为-1时生成闭合图案并填充颜色

    4.3.3 绘制矩形

    cv2.rectangle(img,leftupper,rightdown,color,thickness)

    参数:

    • img:要绘制矩形的图像

    • leftupper、rightdown:矩形的左上角和右下角坐标

    • color:线条的颜色

    • thickness:线条的宽度,为-1时生成闭合图案并填充颜色

    4.3.4 结合使用示例

    import cv2 as cvcat = cv.imread("../images/1.jpg")# 图像绘制没有返回值,只能通过绘制的图像进行显示  (W,H)
    cv.line(cat, (0, 0), (255, 255), (0, 0, 255), 10)
    cv.line(cat, (500, 500), (755, 755), (0, 255, 0), 10)# 绘制矩形
    cv.rectangle(cat, (0, 0), (255, 255), (0, 255, 0), 10)  # -1表示填充# 绘制圆形
    cv.circle(cat, (500, 500), 100, (255, 0, 0), -1)# cv.LINE_AA抗锯齿
    cv.circle(cat, (255, 255), 100, (111, 111, 111), 10, cv.LINE_AA)cv.imshow("myimg", cat)
    cv.waitKey(0)
    cv.destroyAllWindows()

    4.4 关于读取视频

    在 OpenCV-Python 中,读取视频主要通过 VideoCapture类实现。

    4.4.1 基本步骤

    (1)创建VideoCapture对象
    • 读取视频文件:cap = cv2.VideoCapture('video.mp4')
    • 读取摄像头:cap = cv2.VideoCapture(0)(0 表示默认摄像头)
    (2)逐帧读取视频
    • 使用cap.read()返回布尔值ret和帧图像frame
    • ret=True表示成功读取帧
    (3)释放资源
    • 使用cap.release()关闭视频流
    • 使用cv2.destroyAllWindows()关闭所有窗口

    4.4.2 示例代码

    这里将读取视频文件与读取本机摄像头两个功能结合起来了,读者可以参考着敲一下

    # 读取视频文件
    import cv2 as cv# 创建VideoCapture对象
    # video = cv.VideoCapture("../images/videocap.mp4")
    video_my = cv.VideoCapture(0)  # 本机摄像头# 循环读取视频帧,直到没有帧为止
    while True:# 调用read方法读取视频帧# 返回两个值(任意命名即可),第一个是布尔值,表示是否成功读取帧,第二个是帧数据ret, frame = video_my.read()# 判断是否成功读取帧if not ret:print('error!')break# 显示帧cv.imshow("video", frame)# 等待1毫秒,如果按下q键则退出循环# 获取键盘输入的低8位ASCII码,如果没有按键则返回-1if cv.waitKey(10) & 0xFF == ord("q"):print("按键退出")break# 释放资源
    video_my.release()
    cv.destroyAllWindows()
    print("视频播放完毕")
    

    http://www.dtcms.com/a/293236.html

    相关文章:

  • 每日数据推荐:成都市AOI面数据
  • 疯狂星期四文案网第15天运营日记
  • 【langchain】3分钟构建一个上下文聊天机器人
  • 高可用架构模式——FMEA方法(排除架构可用性隐患的利器)
  • linux辅助知识(Shell 脚本编程)
  • Agent 工具箱:一步步搭建你的第一个 MCP 服务
  • day21-定时任务
  • Atcoder Beginner Contest 415 D题
  • Elasticsearch Java 8.x 的聚合 API 及子聚合的用法
  • (Python)类的练习与巩固(图书管理系统)(类与方法的基础教程)(if条件扩展)(动态类型)(Python教程)
  • RDLC报表纵向合并单元格
  • 适配者模式
  • git reset HEAD的实用指南
  • PyQt5—QLabel 学习笔记
  • Python通关秘籍(四)数据结构——列表
  • 发票识别在费控系统应用剖析
  • Linux 重定向和缓冲区
  • 1.两数之和
  • CDN 优化前端打包体积
  • Unity里的加力
  • Linux研学-MySQL安装
  • IP43半加固笔记本L156H
  • Embassy实战:Rust嵌入式异步开发指南
  • 使用docker(ubuntu)搭建web环境(php,apahce2)
  • Vue 3 响应式系统中的 effectScope、watchEffect、effect 和 watch 详解
  • 解锁 Rust 语言:交叉编译与安全防护全攻略
  • Redis - ZSet数据结构与滑动窗口应用
  • 在 WebSocket 中使用 @Autowired 时遇到空指针异常
  • 二、Vue常用指令:v-bind、v-model、v-on
  • 【Python】常见模块及其用法