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

从零开始学习:深度学习(基础入门版)(1天)

(一) opencv和opencv-contrib的安装

(1.1)在桌面地底部的搜索栏,搜索命令提示符,点击并打开命令提示符

(1.2)依次输入命令并按回车pip install opencv-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple和pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple

(二)在pycharm软件中,用python语言,opencv库实现以下功能



此代码主要完成以下任务:

  1. 读取并显示一张本地图片
  2. 交互式控制窗口行为
  3. 输出图像的基础元信息

完整执行流程:

添加了逐行详细注释的完整代码及预期输出示例:

# ✅ 1. 导入必要的库
import cv2          # OpenCV库用于图像处理与计算机视觉任务
import numpy as np # NumPy库用于高效处理多维数组(图像本质是数组)# 📁 2. 读取本地图像文件
a = cv2.imread('1.jpg')  # 从当前工作目录读取名为'1.jpg'的图像文件
#   ▶️ 成功时返回一个NumPy数组(形状=[高度, 宽度, 通道数]),失败返回None# 🖥️ 3. 显示图像窗口
cv2.imshow('tu', a)      # 创建名为'tu'的窗口并显示图像a
#   ⚠️ 注意:此语句不会自动暂停,需配合waitKey()才能看到效果# ⏸️ 4. 等待用户按键输入
b = cv2.waitKey(0)       # 阻塞程序执行,直到用户按下任意键
#   🔑 参数0表示无限期等待,返回值为按下的键对应的ASCII码(本例未使用该值)# ✖️ 5. 关闭所有OpenCV窗口
cv2.destroyAllWindows() # 释放所有创建的GUI窗口资源# 📝 6-8. 输出图像元信息
print("图像形状(shape):", a.shape)    # 输出数组维度:[高, 宽, 通道数]
print("图像数据类型(dtype):", a.dtype) # 输出像素的数据类型(通常为uint8)
print("图像大小(size):", a.size)     # 输出总像素数(高×宽×通道数)
图像形状(shape): (480, 640, 3)
图像数据类型(dtype): uint8
图像大小(size): 921600


此代码主要完成以下任务:

  1. 灰度化处理与保存
  2. 图像区域裁剪与可视化对比
  3. 图像元信息输出
  4. 多窗口交互式显示

完整执行流程:

添加了逐行详细注释的完整代码及预期输出示例:

# -*- coding: utf-8 -*-
import cv2  # 导入OpenCV库,用于图像处理与计算机视觉任务# ==================== 第一阶段:灰度化处理 & 基础信息输出 ====================
# 📷 1. 以灰度模式读取图像
b = cv2.imread(filename=r'./1.jpg', flags=cv2.IMREAD_GRAYSCALE)  # ✅ 关键参数:flags=cv2.IMREAD_GRAYSCALE
#   ↳ 功能:将输入图像转换为单通道灰度图(而非默认的BGR三通道)
#   ↳ 返回值:NumPy数组,形状为 [高度, 宽度](二维数组)# 🖥️ 2. 显示灰度图像窗口
cv2.imshow(winname='zz', mat=b)  # 创建名为 'zz' 的窗口并显示灰度图 b
#   ↳ 注意:此语句不会自动暂停,需配合 waitKey() 才能看到效果# ⏸️ 3. 等待用户按键(防止窗口一闪而过)
a = cv2.waitKey(0)  # 阻塞程序执行,直到用户按下任意键
#   ↳ 参数 0 表示无限期等待,返回值为按下的键对应的 ASCII 码(本例未使用该值)# ✖️ 4. 关闭所有OpenCV窗口
cv2.destroyAllWindows()  # 释放所有创建的GUI窗口资源# 📝 5-7. 输出灰度图的元信息
print("图像形状(shape):", b.shape)    # 输出数组维度:[高度, 宽度](灰度图为二维)
print("图像数据类型(dtype):", b.dtype) # 输出像素的数据类型(通常为 uint8)
print("图像大小(size):", b.size)      # 输出总像素数(高度 × 宽度)# 💾 8. 保存灰度图到文件
cv2.imwrite(filename='timg98_GRAY.jpg', img=b)  # 将灰度图 b 保存为新文件
#   ↳ 注意:若文件已存在会被覆盖# ==================== 第二阶段:图像裁剪 & 双窗口对比 ====================
# 📁 9. 重新读取原始彩色图像(未指定 flags 参数,默认按 BGR 三通道读取)
a = cv2.imread(r'./1.jpg')  # 返回 BGR 三通道图像(形状为 [高度, 宽度, 3])# ✂️ 10. 裁剪图像区域(基于NumPy数组切片)
b = a[30:230, 100:300]  # 选取矩形区域:纵向 30~230px,横向 100~300px
#   ↳ Python切片规则:起始位置包含,终止位置不包含 → 实际裁剪尺寸:高=200px (230-30),宽=200px (300-100)# 🖥️ 11-12. 同时显示原图与裁剪结果
cv2.imshow(winname='yuantu', mat=a)   # 窗口标题 "yuantu"(原图)
cv2.imshow(winname='qiepian', mat=b)  # 窗口标题 "qiepian"(裁剪片段)# ⏸️ 13. 等待用户按键(保持双窗口可见)
cv2.waitKey(0)  # 阻塞程序执行,直到用户按下任意键# ✖️ 14. 关闭所有OpenCV窗口
cv2.destroyAllWindows()  # 释放所有创建的GUI窗口资源
图像形状(shape): (480, 640)       # 灰度图形状(高 x 宽)
图像数据类型(dtype): uint8        # 像素类型(0~255 的无符号整数)
图像大小(size): 307200           # 总像素数 = 480 × 640


此代码主要完成以下任务:

实时获取摄像头视频流 → 转灰度 → 显示画面

完整执行流程:

 

  1. 打开摄像头:通过 cv2.VideoCapture(0) 打开默认摄像头(编号0通常是笔记本内置摄像头)

  2. 检查摄像头是否成功打开:如果失败,打印“无法打开视频文件”并退出程序

  3. 实时读取视频帧:在一个无限循环中,逐帧读取摄像头画面

  4. 将彩色画面转为灰度:使用 cv2.cvtColor 把每一帧从彩色(BGR)转换成灰度图像

  5. 实时显示灰度画面:通过 cv2.imshow 在一个名为“Video”的窗口中显示灰度画面

  6. 按 ESC 键退出:如果用户按下键盘上的 ESC 键(ASCII码27),则跳出循环

  7. 释放资源:关闭摄像头并销毁所有 OpenCV 窗口,避免资源泄露

总结:这段代码会打开你的摄像头,把实时画面变成黑白色,并持续显示,直到你按下 ESC 键退出

添加了逐行详细注释的完整代码及预期输出示例:

import cv2                       # 导入 OpenCV 库
video_capture = cv2.VideoCapture(0)  # 打开默认摄像头(设备索引 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)      # 在名为 'Video' 的窗口中显示当前帧if cv2.waitKey(1) == 27:        # 等待 1 毫秒;若用户按下 ESC(ASCII 27),则跳出循环break
video_capture.release()             # 释放摄像头资源
cv2.destroyAllWindows()             # 关闭所有由 OpenCV 创建的窗口

额外扩充:

  1. cv2.VideoCapture('aiweier.mp4') → 初始化视频捕获对象
  2. isOpened() → 校验文件可读性
  3. while True + read() → 逐帧读取视频流
  4. cvtColor(..., COLOR_BGR2GRAY) → 实时转灰度图
  5. imshow() + waitKey(1) → 动态显示画面 & 响应键盘事件
  6. release() / destroyAllWindows() → 资源清理
    import cv2  # 导入 OpenCV 库,用于视频和图像处理# 创建 VideoCapture 对象,打开名为 'aiweier.mp4' 的视频文件
    video_capture = cv2.VideoCapture('aiweier.mp4')# 检查视频文件是否成功打开
    if not video_capture.isOpened():print("无法打开视频文件")  # 如果无法打开,输出错误提示exit()  # 退出程序# 无限循环,用于逐帧读取和显示视频
    while True:# 从视频中读取下一帧ret, frame = video_capture.read()# 如果读取失败(如到达视频末尾),则跳出循环if not ret:break# 将当前帧从 BGR 彩色图像转换为灰度图像frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 在名为 'Video' 的窗口中显示当前帧cv2.imshow('Video', frame)# 等待键盘输入,等待时间为 1 毫秒# 如果按下 ESC 键(ASCII 码为 27),则跳出循环if cv2.waitKey(1) == 27:break# 释放 VideoCapture 对象,关闭视频文件
    video_capture.release()# 销毁所有 OpenCV 创建的窗口
    cv2.destroyAllWindows()

代码中去除以下代码,代码运行结果为彩色图片

 # 将当前帧从 BGR 彩色图像转换为灰度图像frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)



此代码主要完成以下任务:

从彩色图像中分离并可视化其蓝(B)、绿(G)、红(R)三个独立颜色通道

 

  1. 颜色空间特性

    • OpenCV 默认使用 BGR 而非 RGB 顺序存储颜色图像,因此:
      • img[:, :, 0] → 蓝色通道
      • img[:, :, 1] → 绿色通道
      • img[:, :, 2] → 红色通道
  2. 单通道显示原理

    • 每个颜色通道本质上是一个二维矩阵(高度×宽度),值范围通常为 0-255
    • 当用 imshow() 显示单通道时,OpenCV 自动将其解释为 8位灰度图像,其中:
      • 0 = 纯黑 → 该颜色成分完全缺失
      • 255 = 纯白 → 该颜色成分达到最大强度
  3. 两种通道分离方式对比

    • 切片法 (img[:, :, n]):直观高效,适合少量通道提取
    • cv2.split():返回包含所有通道的列表,适用于批量处理多通道场景

完整执行流程:

添加了逐行详细注释的完整代码及预期输出示例:

import cv2
# 1. 读取图像(默认 BGR 顺序)
img = cv2.imread('1.jpg')
if img is None:raise FileNotFoundError('图像加载失败,请检查路径')
# 2. 方法一:直接切片提取单个通道
b_ch = img[:, :, 0]   # 蓝色通道
g_ch = img[:, :, 1]   # 绿色通道
r_ch = img[:, :, 2]   # 红色通道
# 3. 方法二:用 cv2.split 一次拆出三个通道
# b_ch, g_ch, r_ch = cv2.split(img)
# 4. 分别显示三个通道(单通道图像默认以灰度形式呈现)
cv2.imshow('Blue channel', b_ch)
cv2.imshow('Green channel', g_ch)
cv2.imshow('Red channel', r_ch)
# 5. 等待按键(0 表示无限等待,或给足够大的毫秒数)
cv2.waitKey(0)
# 6. 关闭所有窗口
cv2.destroyAllWindows()



此代码主要完成以下任务:

从输入图像中提取并突出显示蓝色通道的信息

完整执行流程:

添加了逐行详细注释的完整代码及预期输出示例:

# -*- coding: utf-8 -*-
"""
功能:读取一张彩色图,只保留蓝色通道,其余通道置 0,并显示结果
"""# 1. 导入库
import cv2
import numpy as np      # 预留,方便后续扩展# 2. 读取原始图像(默认 BGR 顺序)
img = cv2.imread('1.jpg')          # 在当前工作目录下查找 1.jpg
if img is None:                    # 读取失败时 img 为 Noneraise FileNotFoundError('图像加载失败,请检查 1.jpg 是否存在及路径是否正确')# 3. 复制一份,避免修改原图
img_blue = img.copy()              # 得到与原图同尺寸、同内容的备份# 4. 只保留蓝色通道:将绿色、红色通道全部置 0
#   OpenCV 中 BGR 顺序:0-蓝色(B),1-绿色(G),2-红色(R)
img_blue[:, :, 1] = 0            # 绿色通道全部设为 0
img_blue[:, :, 2] = 0            # 红色通道全部设为 0
# 此时 img_blue 中仅 B 通道有值,其余两通道为 0,整体呈蓝色调# 5. 显示结果
cv2.imshow('Blue-only color image', img_blue)  # 创建一个窗口并显示处理后的图像
cv2.waitKey(0)                                 # 无限等待,直到键盘任意按键
cv2.destroyAllWindows()                        # 销毁所有已创建的窗口



此代码主要完成以下任务:

演示如何使用 OpenCV 分离图像的 BGR 三通道并重新合并回原始彩色图像

完整执行流程:

步骤代码行作用(一句话说明)
1import cv2引入 OpenCV 库,准备图像处理
2img = cv2.imread('1.jpg')把当前目录里的 1.jpg 读进内存,得到 BGR 彩色矩阵
3if img is None:若文件不存在或读取失败,立即报错并终止程序
4b, g, r = cv2.split(img)把彩色图拆成 3 张灰度图:蓝通道、绿通道、红通道
5merged = cv2.merge((b, g, r))把这三张灰度图按 B-G-R 顺序重新合并成一张与原图相同的彩色图
6cv2.imshow('Merged BGR', merged)打开窗口,标题为 Merged BGR,显示合并后的彩色图
7cv2.waitKey(0)暂停程序,等待用户按任意键
8cv2.destroyAllWindows()关闭所有 OpenCV 窗口,释放资源,程序结束

添加了逐行详细注释的完整代码及预期输出示例:

import cv2                       # 导入 OpenCV 库,用于图像读写与显示# 1. 读取图像(默认 BGR 顺序)
img = cv2.imread('1.jpg')        # 从当前工作目录加载 '1.jpg',返回三维 BGR 数组
if img is None:                  # 检查是否加载成功raise FileNotFoundError('图片路径错误或文件不存在')  # 若失败,立即抛出异常并终止程序# 2. 分离 BGR 三通道
b, g, r = cv2.split(img)         # 把 BGR 图像拆成 3 个单通道数组:b(蓝)、g(绿)、r(红)# 等价于 b = img[:, :, 0]; g = img[:, :, 1]; r = img[:, :, 2]# 3. 重新合并三通道,得到与原图一致的彩色图
merged = cv2.merge((b, g, r))    # 把 b、g、r 三个二维数组按顺序叠成一幅新的三通道彩色图# 也可写成 cv2.merge([b, g, r])# 4. 显示结果
cv2.imshow('Merged BGR', merged) # 创建名为 'Merged BGR' 的窗口并展示合并后的彩色图
cv2.waitKey(0)                   # 无限等待键盘事件;按任意键后继续
cv2.destroyAllWindows()          # 销毁所有已打开的 OpenCV 窗口,释放资源



此代码主要完成以下任务:

对一张图片的局部区域进行随机着色并显示结果

完整执行流程:

步骤代码行作用说明
1import cv2导入 OpenCV 库,用于图像读写与显示
2import numpy as np导入 NumPy 库,方便生成随机数组并进行矩阵操作
3a = cv2.imread('1.jpg')读取磁盘文件 1.jpg,将其加载为 NumPy 数组并存入变量 a
4a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))在 a 的指定区域(行 100–199、列 200–299)上覆盖随机彩色像素,实现打码/马赛克效果
5cv2.imshow('masaike', a)新建名为 masaike 的窗口,并在其中显示处理后的图像 a
6cv2.waitKey(1000000)等待键盘事件,最长约 1000 秒;期间窗口保持显示
7cv2.destroyAllWindows()关闭所有由 OpenCV 创建的窗口,释放资源

添加了逐行详细注释的完整代码及预期输出示例:

import cv2           # 导入 OpenCV 库,用于图像的读取、显示与保存
import numpy as np   # 导入 NumPy 库,用于高效的数组操作与随机数生成# 1. 从当前目录读取图像文件 1.jpg,返回一个三维的 BGR 图像数组
a = cv2.imread('1.jpg')# 2. 在图像 a 的指定区域(行 100~199,列 200~299)上覆盖随机彩色像素块
#    np.random.randint(0, 256, (100, 100, 3)) 生成形状为 (100, 100, 3) 的随机整数矩阵,
#    每个元素取值范围 [0, 255],对应 BGR 三通道,实现“马赛克”或“打码”效果
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))# 3. 创建一个名为 'masaike' 的窗口,并在其中显示处理后的图像 a
cv2.imshow('masaike', a)# 4. 等待键盘事件,最长等待 1 000 000 毫秒(≈ 1000 秒)
#    期间窗口保持显示,按任意键可提前结束等待
cv2.waitKey(1000000)# 5. 销毁所有由 OpenCV 创建的窗口,释放资源
cv2.destroyAllWindows()



此代码主要完成以下任务:

将一张图片(1.jpg)的特定区域复制到另一张图片(mimi.jpg)的指定位置,并同步显示两张图片的效果
完整执行流程:

步骤代码作用说明
1import cv2载入 OpenCV 库,提供图像读写与显示功能
2a = cv2.imread('1.jpg')读取图像文件 1.jpg 并存储到变量 a
3b = cv2.imread('mimi.jpg')读取图像文件 mimi.jpg 并存储到变量 b
4b[200:350, 200:350] = a[50:200, 100:250]将 a 中第 50–199 行、100–249 列的像素区域复制到 b 的第 200–349 行、200–349 列,实现区域替换;要求两块区域尺寸一致(150×150)
5cv2.imshow('b', b)创建名为 b 的窗口并显示处理后的图像 b
6cv2.imshow('a', a)创建名为 a 的窗口并显示原始图像 a,方便对比查看
7cv2.waitKey(100000)等待键盘事件,最长约 100 秒;按任意键可提前结束
8cv2.destroyAllWindows()关闭所有 OpenCV 创建的窗口,释放资源


添加了逐行详细注释的完整代码及预期输出示例:

import cv2                            # 1. 导入 OpenCV 库,用于图像读写与显示# 2. 读取两张图片
a = cv2.imread('1.jpg')               # 读取 1.jpg,存入变量 a(原始图像)
b = cv2.imread('mimi.jpg')            # 读取 mimi.jpg,存入变量 b(目标图像)# 3. 区域复制:将 a 中第 50~199 行、100~249 列的 150×150 像素区域
#    覆盖到 b 中第 200~349 行、200~349 列的位置
#    注意:源区域与目标区域尺寸必须一致(都是 150×150)
b[200:350, 200:350] = a[50:200, 100:250]# 4. 显示处理后的结果
cv2.imshow('b', b)                    # 创建名为 "b" 的窗口,显示替换后的图像 b
cv2.imshow('a', a)                    # 创建名为 "a" 的窗口,显示原始图像 a,便于对比cv2.waitKey(100000)                   # 5. 等待键盘事件,最长约 100 秒;按任意键可提前退出
cv2.destroyAllWindows()               # 6. 关闭所有 OpenCV 创建的窗口,释放资源


 


此代码主要完成以下任务:

主要演示了 OpenCV 中两种不同的图像缩放方法,并通过窗口对比展示原始图像与缩放后的效果

完整执行流程:

1.读取原始图像 → 2. 尝试两种缩放方式 → 3. 打印原始图像尺寸 → 4. 双窗口对比显示 → 5. 持久化展示结果

步骤代码作用说明
1import cv2导入 OpenCV 库,提供图像读写与显示功能
2a = cv2.imread('1.jpg')读取文件 1.jpg,将其加载为 NumPy 数组并存入变量 a
3b = cv2.imread('mimi.jpg')读取文件 mimi.jpg,将其加载为 NumPy 数组并存入变量 b
4b[200:350, 200:350] = a[50:200, 100:250]将 a 中第 50–199 行、100–249 列的 150×150 像素区域复制到 b 的第 200–349 行、200–349 列,实现区域替换(要求两区域尺寸一致)
5cv2.imshow('b', b)创建名为 “b” 的窗口,显示经过替换处理后的图像 b
6cv2.imshow('a', a)创建名为 “a” 的窗口,显示原始图像 a,方便与结果对比
7cv2.waitKey(100000)等待键盘事件,最长约 100 秒;按任意键可提前结束等待
8cv2.destroyAllWindows()关闭所有由 OpenCV 创建的窗口,释放资源


添加了逐行详细注释的完整代码及预期输出示例:

import cv2                # 1. 导入 OpenCV 库,用于图像处理与显示# 2. 读取图像文件 mimi.jpg,返回三维 BGR 数组
a = cv2.imread('mimi.jpg')# 3. 第一次缩放:强制把图像调整为指定尺寸
#    dsize=(200, 600) 表示输出图像宽度 200 像素,高度 600 像素
#    注意:此行计算出的 a_new 会被下一行覆盖,实际不会生效
a_new = cv2.resize(a, dsize=(200, 600))  # 宽、高# 4. 第二次缩放:按相对比例缩放
#    dsize=None 表示不使用绝对尺寸,而是根据 fx、fy 进行缩放
#    fx=1.5 → 宽度放大为原来的 1.5 倍
#    fy=0.5 → 高度缩小为原来的 0.5 倍
a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5)# 5. 打印原图 a 的形状(行数=高,列数=宽,第 3 维=通道数 BGR)
print(a.shape)  # 高、宽、通道数# 6. 分别显示原图和缩放后的图像
cv2.imshow('a', a)        # 显示原图
cv2.imshow('a_new', a_new)  # 显示缩放后的图像# 7. 等待键盘事件,最长约 100 秒;按任意键可提前退出
cv2.waitKey(100000)# 8. 关闭所有 OpenCV 创建的窗口,释放资源
cv2.destroyAllWindows()

 

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

相关文章:

  • [激光原理与应用-168]:测量仪器 - 对光学指标进行测量的仪器
  • 从“数字网格”到“空中交警” :星图低空云如何重构低空管理?
  • 嵌入式第二十二课!!!链式队列与哈希表
  • Maven分模块开发实战指南
  • Qt 子类重新实现父类的槽函数
  • 「iOS」————持久化
  • 【0基础3ds Max】菜单栏介绍
  • 【分享】我国八大沙漠空间矢量范围
  • Bonree ONE发布直通车 | 可观测平台如何深度应用LLM技术
  • 如何科学选择光伏运维系统?
  • docker安装半本地化安装方法
  • Shuffle SOAR使用学习经验
  • FreeRTOS2
  • 4G/5G无线电单元系统
  • 水下管道巡检机器人cad【10张】三维图+设计说明书
  • ai短视频与真人短视频哪个更好?
  • Docker容器部署harbor-小白级教学
  • Aurora MySQL 8.0 性能分析账号创建完整指南
  • ego-planner代码个人阅读笔记
  • 智慧物流分拣效率↑40%:陌讯多模态融合算法实战解析
  • Spring AI Alibaba 项目接入阿里云百炼平台大模型
  • leetcode-hot-100 (技巧)
  • STM32 HAL库外设编程学习笔记
  • SpringBoot中的单例注入方式
  • 上位机知识篇---AT指令
  • 「日拱一码」045 机器学习-因果发现算法
  • C 语言第 17 天学习笔记:从二级指针到内存布局的进阶指南
  • 力控汽车零部件冲压MES系统方案
  • 2025最新国内服务器可用docker源仓库地址大全(2025年8月更新) · DockerHub镜像加速全面指南
  • STM32学习笔记4-OLED外部中断和中断系统