第四周:Python学习笔记

文章目录

  • (一)Os库的学习
    • 1、路径操作
    • 2、进程管理
    • 3、环境参数
      • 3.1 os.mkdir()
      • 3.2 os.listdir()
  • (二)shutil库的学习
    • 1、shutil.copyfile(src,dst)
    • 2、shutil.copy2(src,dst)
    • 3、shutil.copytree(src,dst,symlinks,ignore=None)
    • 4、shutil.rmtree(path)
    • 5、shutil.move(src, dst)
    • 6、shutil.make_archive()
    • 7、shutil.unpack_archive()
  • (三)Os,shutil库及excel的综合小练习
  • (四)Matplotlib学习
    • 1、安装
    • 2、matplotlib画廊
    • 3、plot()绘制简单的折线图
      • 3.1 修改标签文字和线条粗细
      • 3.2 矫正图形
      • 3.3 使用scatter()绘制散点图并设置其样式
      • 3.4 使用scatter()绘制一系列点
      • 3.5 自动计算数据
      • 3.6 删除数据点的轮廓
  • (五)Matplotlib,opencv初探小练习
    • 1、Matplotlib读取图片并可视化出来
    • 2、opencv读入不同形式的图【灰度图,彩图】,save到另一指定路径
  • (六)opencv学习
    • 0、安装
    • 1、读取照片视频和摄像头——Read Images Videos and Webcams
      • 1.1 cv2.imread 读取照片并显示
      • 1.2 cv2.VideoCapture 读取视频并显示
      • 1.3 cv2.VideoCapture 调用摄像头并显示实时视频
    • 2、基础函数——Basic Functions
      • 2.1 cv2.cvtColor-读取灰度图
      • 2.2 cv2.GaussianBlur-blur增加模糊度
      • 2.3 cv2.Canny:edge detector-边缘探测
      • 2.4 dialation(膨胀,扩张):cv2.dilate 增加边缘的厚度(用到numpy)-变厚!
      • 2.5 erosion(降低):cv2.erode-边缘变细!
    • 3、调整大小和裁剪——RESIZING AND CROPPING
      • 3.0 问题!!
      • 3.1 cv2.resize-改变图片大小
      • 3.2 crop:imgCropped = img[, ]-剪裁
    • 4、形状和文本-SHAPES AND TEXTS
  • (七)汇报中遇到的问题还有可以改进的地方(未完)~
    • 1、上面的Os,shutil库及excel的综合小练习要用os.path.join再写一遍
    • 2、上面的Matplotlib,opencv初探小练习的路径不要写固定,用input输入灵活一些
    • 3、深入了解kernel、dilate和erode等的真正意义
    • 4、dir是directory,path的意思
    • 5、注意“\”在path中对于不同系统的意义
    • 6、os.abspath:绝对路径相对路径的理解

第四周:Python学习笔记_第1张图片
第四周学习任务

  • 1. 函数的定义及调用,自己设计完成一个小demo
  • 2. Os,shutil库的学习及excel写任务
    主要内容 os.path.join os.path.exists os.listdir os.mkdir shutil.copy等
    具体任务 判断指定目录dir1(自己指定,非py文件的当前目录)是否存在,若不存在创建该目录,将已存在的另一目录dir2 中的若干张图片复制到dir1中,并将文件名写入一excel中,并保存。
  • 3. Matplotlib,opencv初探
    主要任务,在任务一的基础上,①使用matplotlib从dir2中读入每张图片,并用show函数可视化出来②用opencv从dir2中用不同的形式【灰度图,彩图】读入每张图片,并save到另一指定路径

注意:

  • 可增加难度,图片格式采用jpg和png混合的方式,处理不同类型数据。
  • 学有余力,学习opencv一些常用的处理图片的方法。

注意保存积累代码,讲解代码及实现过程。
在这里插入图片描述
2020.7.29 周三中午更新


(一)Os库的学习

os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录…… 但是,os文件的操作还应该包含移动 复制 打包 压缩 解压等操作,这些os模块都没有提供。

主要内容:os.path.join os.path.exists os.listdir os.mkdir
一开始想要利用pip指令安装这个库,但是总是提示错误
在这里插入图片描述
后来度娘之后发现Os是内置库,我大概学的是个假Python…
在这里插入图片描述
由于在JupyterNotebook上面得到的路径都些许的奇怪
第四周:Python学习笔记_第2张图片
明明应该给我的结果是这种格式
在这里插入图片描述
所以这部分代码我都在PyCharm里面运行了
在这里插入图片描述
python os库的使用方法_CSDN

1、路径操作

os.path子库以path为入口,用于操作和处理文件路径

函数 描述
os.path.abspath(path) 返回path在当前系统中的绝对路径os.path.abspath('第四周学习记录.txt')
输出:'E:\20年暑假学习\第四周\PyCharm\第四周学习记录.txt’
关于这个语句有一些疑问
但其实’第四周学习记录.txt’的路径是E:\Amusement\Python\第四周学习记录.txt,
这个函数os.path.abspath(path)返回的路径是我创建的Pycharm程序的路径(因为我是用这个路径下的Pycharm运行的这段代码),
但是这个路径下并没有’第四周学习记录.txt’这个文件
os.path.normpath(path) 归一化path的表示形式,统一用\分割路径
os.path.normpath(r'E:\Amusement\Python\第四周学习记录.txt')
输出:'E:\Amusement\Python\第四周学习记录.txt’
os.path.normpath('E://Amusement//Python//第四周学习记录.txt')
输出:‘E:\Amusement\Python\第四周学习记录.txt’
os.path.relpath(path) 返回当前程序与文件之间的相对路径(relative path)
os.path.relpath(r'E:\Amusement\Python\第四周学习记录.txt')
输出:’…\Amusement\Python\第四周学习记录.txt’
os.path.dirname(path) 返回path中的目录名称os.path.dirname(r'E:\Amusement\Python\第四周学习记录.txt')
输出:‘E:\Amusement\Python’
os.path.basename(path) 返回path中最后的文件名称,如果最后一级也是目录,则返回目录名称
os.path.basename(r'E:\Amusement\Python\第四周学习记录.txt')
输出:'第四周学习记录.txt’
os.path.basename(r'E:\Amusement\Python')
输出:‘Python’
os.path.split(path) 返回path中目录和文件名称,如果path最后一集也是目录,则都返回目录名称如果path只有根路径,返回根路径和空路径
os.path.split(r'E:\Amusement\Python\第四周学习记录.txt')
输出:’(‘E:\Amusement\Python’, ‘第四周学习记录.txt’)‘
os.path.split(r'E:\Amusement\Python')
输出:’(‘E:\Amusement’, ‘Python’)‘
os.path.split(r'E:')
输出:’(‘E:’, ‘’)’
os.path.join(path, *paths) 组合path和paths,返回一个路径字符串
os.path.join(r'E:', r'\Amusement\Python\第四周学习记录.txt')
输出:‘E:\Amusement\Python\第四周学习记录.txt’
os.path.exists(path) 判断path对应文件或目录是否存在,返回True或False
os.path.exists('第四周学习记录.txt') # 不在此程序的目录下输出:'False’
os.path.exists('Test.txt') # 在此程序的目录下输出:‘True’
os.path.isfile(path) 判断path所对应是否为已存在的文件,返回True或False
os.path.isfile(r'E:\Amusement\Python\第四周学习记录.txt')输出:‘True’
os.path.isdir(path) 判断path所对应是否为已存在的目录,返回True或False
os.path.isdir(r'E:\Amusement\Python')输出:‘True’
os.path.getmtime(path) 返回path对应文件或目录最近一次的修改时间
os.path.getmtime(r'E:\Amusement\Python\第四周学习记录.txt')输出:‘1596015422.8338652’
os.path.getatime(path) 返回path对应文件或目录上一次的访问时间
os.path.getatime(r'E:\Amusement\Python\第四周学习记录.txt')输出:‘1596015422.8338652’
os.path.getctime(path) 返回path对应文件或目录创建时间。windows系统中,上一次访问时间等于创建时间
os.path.getctime(r'E:\Amusement\Python\第四周学习记录.txt') 输出:‘1596012914.8609786’
os.path.getsize(path) 返回path对应文件的大小,以字节为单位
os.path.getsize(r'E:\Amusement\Python\第四周学习记录.txt')输出:‘96’

PyCharm中可执行代码如下

import os

# 返回path在当前系统中的绝对路径
# 但其实'第四周学习记录.txt'的路径是E:\Amusement\Python\第四周学习记录.txt,
# 这个函数返回的路径是我创建的Pycharm程序的路径
# (因为我是用这个路径下的Pycharm运行的这段代码),
# 但是这个路径下并没有'第四周学习记录.txt'这个文件
print(os.path.abspath('第四周学习任务.docx'))
print(os.path.abspath('第四周学习记录.txt'))

# 归一化path的表示形式,统一用\分割路径
print(os.path.normpath(r'E:\530实验室\政源学长\20年暑假学习\第四周\PyCharm\第四周学习任务.docx'))
print(os.path.normpath('E://530实验室//政源学长//20年暑假学习//第四周//PyCharm//第四周学习任务.docx'))
print(os.path.normpath(r'E:\Amusement\Python\第四周学习记录.txt'))
print(os.path.normpath('E://Amusement//Python//第四周学习记录.txt'))

# 返回当前程序与文件之间的相对路径(relative path)
print(os.path.relpath(r'E:\Amusement\Python\第四周学习记录.txt'))

# 返回path中的目录名称
print(os.path.dirname(r'E:\Amusement\Python\第四周学习记录.txt'))

# 返回path中最后的文件名称,如果最后一级也是目录,则返回目录名称
print(os.path.basename(r'E:\Amusement\Python\第四周学习记录.txt'))
print(os.path.basename(r'E:\Amusement\Python'))

# 返回path中目录和文件名称,如果path最后一集也是目录,
# 则都返回目录名称如果path只有根路径,返回根路径和空路径
print(os.path.split(r'E:\Amusement\Python\第四周学习记录.txt'))
print(os.path.split(r'E:\Amusement\Python'))
print(os.path.split(r'E:'))

# 组合path和paths,返回一个路径字符串
print(os.path.join(r'E:', r'\Amusement\Python\第四周学习记录.txt'))

# 判断path对应文件或目录是否存在,返回True或False
print(os.path.exists('第四周学习记录.txt'))  # 不在此程序的目录下
print(os.path.exists('Test.txt'))  # 在此程序的目录下

# 判断path所对应是否为已存在的文件,返回True或False
print(os.path.isfile(r'E:\Amusement\Python\第四周学习记录.txt'))
print(os.path.isfile(r'E:\Amusement\Python'))  # 这里的路径是文件夹的路径,函数的结构为False

# 判断path所对应是否为已存在的目录,返回True或False
print(os.path.isdir(r'E:\Amusement\Python'))

# 返回path对应文件或目录最近一次的修改时间
print(os.path.getmtime(r'E:\Amusement\Python\第四周学习记录.txt'))  # 1596015422.8338652

# 返回path对应文件或目录上一次的访问时间
print(os.path.getatime(r'E:\Amusement\Python\第四周学习记录.txt'))  # 1596015422.8338652

# 返回path对应文件或目录创建时间。windows系统中,上一次访问时间等于创建时间
print(os.path.getctime(r'E:\Amusement\Python\第四周学习记录.txt'))  # 1596012914.8609786

# 返回path对应文件的大小,以字节为单位
print(os.path.getsize(r'E:\Amusement\Python\第四周学习记录.txt'))  # 96

2、进程管理

os.system(command)

  • 执行程序或命令command
  • 在windows系统中,返回值为cmd的调用返回信息

如下例,调用计算器返回值为0

import os
os.system(r'C:\Windows\system32\calc.exe')  # 打开计算器 返回值为0

调用网易云音乐,成功打开但是出现了很多错误提示

import os
os.system(r'D:\ProgramFiles\CloudMusic\cloudmusic.exe')

第四周:Python学习笔记_第3张图片

  • 部分错误提示:
    第四周:Python学习笔记_第4张图片
  • 调用Arctime Pro但是失败了
import os
os.system(r'D:\ProgramFiles\ARCTIME_PRO_2.4_WIN64\Arctime Pro.exe')

在这里插入图片描述

3、环境参数

Python OS 文件/目录方法_菜鸟教程

3.1 os.mkdir()

概述
os.mkdir() 方法用于以数字权限模式创建目录。默认的模式为 0777 (八进制)。
数字权限管理(Digital Rights Management)是保护多媒体内容免受未经授权的播放和复制的一种方法。

语法

os.mkdir(path[, mode])

参数

  • path – 要创建的目录
  • mode – 要为目录设置的权限数字模式

返回值
没有返回值

实例

import os, sys

path = "E:\Amusement\TestMkdir"
os.mkdir(path, 0o755);

第四周:Python学习笔记_第5张图片

3.2 os.listdir()

概述
返回指定的文件夹包含的文件或文件夹的名字的列表

语法

os.listdir(path)

参数

  • path – 需要列出的目录路径

返回值
返回指定路径下的文件和文件夹列表

实例

# 返回path目录下所有文件 以列表形式输出
import os
print(os.listdir(r'E:\Amusement'))  
# 一个为一行输出
import os
# 打开文件
path = "E:\Amusement"
dirs = os.listdir(path)
# 输出所有的文件和文件夹
for file in dirs:
    print(file)

(二)shutil库的学习

76_shutil模块_Python语法基础和常用模块使用_千锋教程_B站
python之模块之shutil模块_cnblogs
shutil-- --High-level file operations 高级的文件操作模块。

os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录…… 但是,os文件的操作还应该包含移动 复制 打包 压缩 解压等操作,这些os模块都没有提供。
shutil则就是对os中文件操作的补充。–移动 复制 打包 压缩 解压,

1、shutil.copyfile(src,dst)

拷贝文件

import shutil
# shutil.copyfile('./Test.txt', './dstInPC')
# shutil.copyfile('./Test.txt', '../dstInProj')
# shutil.copyfile('./Os库学习.py', './Os库学习Copy')
shutil.copyfile('../第四周学习任务.docx', './FileCopy任务')

第四周:Python学习笔记_第6张图片

import shutil
shutil.copyfile('../JupyterNotebook/Os库学习.ipynb', './JN_Os库学习.ipynb')

第四周:Python学习笔记_第7张图片
路径也可以是非py文件的当前目录

import shutil
shutil.copyfile(r'E:\Amusement\count.txt', r'E:\Competition\countCopy.txt')

2、shutil.copy2(src,dst)

复制文件的内容以及文件的所有状态信息,如权限等

import shutil
shutil.copy2(r'D:\3D66\使用说明.txt', 'E:\使用说明.txt')

3、shutil.copytree(src,dst,symlinks,ignore=None)

递归的拷贝文件

import shutil
shutil.copytree(r'E:\电子书', r'E:\报名表\Copy')

拷贝文件夹中的每一个文件
第四周:Python学习笔记_第8张图片
忽略掉.png格式的照片,代码如下

shutil.copytree(r'F:\照片\壁纸',
                r'E:\530实验室\照片',
                ignore=shutil.ignore_patterns('*.png'))

第四周:Python学习笔记_第9张图片

4、shutil.rmtree(path)

删除

shutil.rmtree(r'E:\530实验室\dir1')  # 结尾要是一个明确的文件名

5、shutil.move(src, dst)

剪切

shutil.move(r'E:\530实验室\dir1', r'E:\530实验室\dircopy')  # 删除源文件,生成新文件

6、shutil.make_archive()

压缩

shutil.make_archive('压缩包',  # 压缩后文件名
                    'gztar',  # 指定的压缩格式
                    r'E:\530实验室\dircopy')  # 被压缩的文件夹名字

支持的压缩格式

print(shutil.get_archive_formats())  # 返回支持的压缩包格式

7、shutil.unpack_archive()

解压

#                       解压的文件名       解压到哪个路径下         压缩的格式
shutil.unpack_archive('./压缩包.tar.gz', r'E:\530实验室\Packege', 'gztar')

第四周:Python学习笔记_第10张图片

(三)Os,shutil库及excel的综合小练习

判断指定目录dir1(自己指定,非py文件的当前目录)是否存在,若不存在创建该目录,将已存在的另一目录dir2 中的若干张图片复制到dir1中,并将文件名写入一excel中,并保存

import shutil, os, openpyxl
# 判定指定目录dir1是否存在
print(os.path.exists(r'E:\Amusement\dir1_1'))
print(os.path.exists(r'E:\Amusement\dir1_2'))

# 第一种方法
# if not os.path.isdir(r'E:\Amusement\dir1_2'):
#     os.mkdir(r'E:\Amusement\dir1_2', 0o775)
os.mkdir(r'E:\Amusement\dir1_1', 0o775)  # 若不存在,用os.mkdir()创建
# 将dir2中的文件复制到dir1中,一个一个复制
shutil.copy2(r'E:\530实验室\政源学长\Python\dir2\宫崎骏.jpg', r'E:\Amusement\dir1_1\宫崎骏copy.jpg')
shutil.copy2(r'E:\530实验室\政源学长\Python\dir2\han3.png', r'E:\Amusement\dir1_1\han3copy.png')
# ...所有照片同理

# 第二种方法
# dir1_2不存在,创建dir1_2,将dir2中的内容复制到dir1_2
shutil.copytree(r'E:\530实验室\政源学长\Python\dir2', r'E:\Amusement\dir1_2')

# dir1中只保存.jpg格式的照片
shutil.copytree(r'F:\照片\壁纸',
                r'E:\530实验室\dir1',
                ignore=shutil.ignore_patterns('*.png'))

wb = openpyxl.Workbook()  # 创建工作簿
ws = wb.create_sheet('PictureNames')  # 创建表单

dirs = os.listdir(r'E:\Amusement\dir1_2')  # 将dir1_2中的文件名以list保存至
ws.append(dirs)  # 将dirs列表中的内容输入ws表单

wb.save('PictureNames.xlsx')

创建的Excel表格
第四周:Python学习笔记_第11张图片
dir2源文件
第四周:Python学习笔记_第12张图片
dir1_1文件
在这里插入图片描述
dir1_2文件
第四周:Python学习笔记_第13张图片
dir1文件,无.png格式的照片
第四周:Python学习笔记_第14张图片

2020.7.29 星期三 下午更新


(四)Matplotlib学习

1、安装

  1. Win+R输入cmd进入到CMD窗口下,执行python -m pip install -U pip setuptools进行升级
    第四周:Python学习笔记_第15张图片

  2. 输入python -m pip install matplotlib进行自动的安装,系统会自动下载安装包
    第四周:Python学习笔记_第16张图片

  3. 注意安装环境噢,由于我的项目环境名为tensorflow37,所以我需要先激活这个环境再进行安装才能将matplotlib成功安装到我当前所需要的环境中,直接在默认环境中安装不会直接将matplotlib直接导入tensorflow37这个我在用的环境
    第四周:Python学习笔记_第17张图片

2、matplotlib画廊

matplotlib的示例画廊

3、plot()绘制简单的折线图

# 导入pyplot模块(包含很多用于生成图表的函数),指定别名plt,以免反复输入pyplot
import matplotlib.pyplot as plt

squares = [1, 4, 9, 16, 25]  # 创建列表
plt.plot(squares)  # plot()函数尝试根据这些数字绘制有意义的图形
plt.show()  # plt.show()打开matplotlib查看器,显示绘制的图形

第四周:Python学习笔记_第18张图片

3.1 修改标签文字和线条粗细

# 导入pyplot模块(包含很多用于生成图表的函数),指定别名plt,以免反复输入pyplot
import matplotlib.pyplot as plt

squares = [1, 4, 9, 16, 25]
plt.plot(squares, linewidth=5)  # linewidth决定线条粗细

# 设置图表标题,并给坐标加上标签
plt.title("Square Numbers", fontsize=24)  # 指定标题
plt.xlabel("Value", fontsize=14)  # 横轴指定标题
plt.ylabel("Square of Value", fontsize=14)  # 纵轴指定标题

# 设置刻度标记的大小
plt.tick_params(axis='both', labelsize=14)  # 设置刻度的样式
plt.show()

图标阅读容易得多
第四周:Python学习笔记_第19张图片

3.2 矫正图形

仔细观察我们可以发现上面的图形有错误!4^2=25!这是由于列表默认下标从0开始,而我们的列表数[1, 4, 9, …]是从1开始的数字的平方。
修复问题
当你向plot()提供一系列数字时,它假设第一个数据点对应的x坐标值为0,但我们的第一个点对应的x值为1。所以为了改变这种默认行为,我们可以给plot()同时提供输入值和输出值。

# 导入pyplot模块(包含很多用于生成图表的函数),指定别名plt,以免反复输入pyplot
import matplotlib.pyplot as plt

input_values = [1, 2, 3, 4, 5]  # 提供输入
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)

# 设置图表标题,给坐标加上标签
--snip--

第四周:Python学习笔记_第20张图片

3.3 使用scatter()绘制散点图并设置其样式

3.3.1绘制单个点

import matplotlib.pyplot as plt
plt.scatter(2, 4)  # 绘制单个点,向scatter()传递x,y轴
plt.show()

第四周:Python学习笔记_第21张图片

3.3.2设置输出样式:添加标题,给轴加上标签,确保所有文本都大到能够看清

import matplotlib.pyplot as plt

plt.scatter(2, 4, s=200)  # 设置点的大小

plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)

plt.tick_params(axis='both', labelsize=14)

plt.show()

第四周:Python学习笔记_第22张图片

3.4 使用scatter()绘制一系列点

向scatter()传递两个分别包含x值和y值的列表

import matplotlib.pyplot as plt

x_values = [1, 2, 3, 4, 5]
y_values = [1, 4, 9, 16, 25]

plt.scatter(x_values, y_values, s=100)

# 设置图表标题,并给坐标加上标签
--snip--

第四周:Python学习笔记_第23张图片

3.5 自动计算数据

利用scatter()绘制1000个点

import matplotlib.pyplot as plt

x_values = list(range(1, 10001))
y_values = [x**2 for x in x_values]  # 推导式

plt.scatter(x_values, y_values, s=40)

# 设置图表标题,并给坐标加上标签
--snip--

# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 110000])

plt.show()

第四周:Python学习笔记_第24张图片

3.6 删除数据点的轮廓

各个点的颜色默认为蓝色点和黑色轮廓(但是我之前的图像没看到黑色轮廓啊!!),删除数据点的轮廓,可在调用scatter()函数时传递实参edgecolor=‘none’

plt.scatter(x_values, y_values, edgecolor='none', s=40)

第四周:Python学习笔记_第25张图片
2020.7.30 星期四 上午更新


(五)Matplotlib,opencv初探小练习

1、Matplotlib读取图片并可视化出来

# 使用matplotlib从dir2中读入每张图片,并用show函数可视化出来
import matplotlib.image as implt
import matplotlib.pyplot as plt

x = implt.imread(r'E:\Amusement\dir1_2\农田.jpg')
plt.imshow(x)
plt.waitforbuttonpress(0)

第四周:Python学习笔记_第26张图片
第四周:Python学习笔记_第27张图片

2、opencv读入不同形式的图【灰度图,彩图】,save到另一指定路径

import cv2
import numpy as np

# 读取
img = cv2.imread(r'E:\Pictures\dir2\han2.png')  # 读取照片
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8)  # 用numpy创建kernel:values=1
#                 大小     类型:unsigned integer of 8-bit。values range from 0-255

imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# (7, 7): kernal size(卷积):odd number
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200)  # 值越大边缘越模糊
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)
imgEroded = cv2.erode(imgDialation, kernel, iterations=1)  # 变细

# 显示
cv2.imshow("Image", img)  # 彩图
cv2.imshow("Gray Image", imgGray)  # 灰度图
cv2.imshow("Blur Image", imgBlur)  # 模糊版
cv2.imshow("Canny Image", imgCanny)  # 边缘
cv2.imshow("Dialation Image", imgDialation)  # 边缘膨胀扩大
cv2.imshow("Eroded Image", imgEroded)  # 边缘变细

# 保存
cv2.imwrite(r'E:\Competition\saveImg.jpg', img)  # 保存为jpg类型的
cv2.imwrite(r'E:\Competition\saveImg.png', img)
cv2.imwrite(r'E:\Competition\GrayImg.png', imgGray)
cv2.imwrite(r'E:\Competition\BlurImg.png', imgBlur)
cv2.imwrite(r'E:\Competition\CannyImg.png', imgCanny)
cv2.imwrite(r'E:\Competition\DialationImg.png', imgDialation)
cv2.imwrite(r'E:\Competition\ErodedImg.png', imgEroded)

cv2.waitKey(0)

第四周:Python学习笔记_第28张图片
2020.8.1晚上更新


(六)opencv学习

2020最新-3h精通Opencv

0、安装

pip install opencv-python

安装成功
第四周:Python学习笔记_第29张图片
在这里插入图片描述

1、读取照片视频和摄像头——Read Images Videos and Webcams

1.1 cv2.imread 读取照片并显示

import cv2

img = cv2.imread(r'E:\Pictures\dir2\han2.png')  # 读取照片到img

cv2.imshow('Output', img)  # 显示照片 ("名字", 要显示的照片)
cv2.waitKey(0)  # 0=infinite delay;如果是1则是1milliseconds

1.2 cv2.VideoCapture 读取视频并显示

import cv2

cap = cv2.VideoCapture(r'E:\Pictures\蝙蝠侠.mp4')  # 选取视频路径

# we need a while loop to go through each frame one by one
while True:  # 使用循环读取
    success, img = cap.read()  # 将cap的图片一个一个赋值给img
    cv2.imshow("Video", img)  # img显示出来
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 当按下q结束循环
        break

第四周:Python学习笔记_第30张图片

1.3 cv2.VideoCapture 调用摄像头并显示实时视频

import cv2

cap = cv2.VideoCapture(0)  # 写摄像头的ID, 默认为0
cap.set(3, 640)  # 长(ID=3)=640
cap.set(4, 480)  # 宽(ID=4)=480
cap.set(10, 100)  # 改变亮度(ID=10)

# we need a while loop to go through each frame one by one
while True:  # 使用循环读取
    success, img = cap.read()  # 将cap的图片一个一个赋值给img
    cv2.imshow("Video", img)  # img显示出来
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 当按下q结束循环
        break

第四周:Python学习笔记_第31张图片

2、基础函数——Basic Functions

2.1 cv2.cvtColor-读取灰度图

import cv2

img = cv2.imread(r'E:\Pictures\dir2\han2.png')  # 读取照片

# 在opencv中照片是BGR
# cvtColor=converts(转化) image into different color spaces
# BGR to GRAY
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow("Gray Image", imgGray)
cv2.waitKey(0)

2.2 cv2.GaussianBlur-blur增加模糊度

import cv2

img = cv2.imread(r'E:\Pictures\dir2\han2.png')  # 读取照片

imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# (7, 7): kernal size(卷积):odd number
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)

cv2.imshow("Gray Image", imgGray)  # 原版:进行对比
cv2.imshow("Blur Image", imgBlur)  # 模糊版
cv2.waitKey(0)

2.3 cv2.Canny:edge detector-边缘探测

import cv2

img = cv2.imread(r'E:\Pictures\dir2\han2.png')  # 读取照片

imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200)  # 值越大边缘越模糊

cv2.imshow("Gray Image", imgGray)  # 原版:进行对比
cv2.imshow("Blur Image", imgBlur)  # 模糊版
cv2.imshow("Canny Image", imgCanny)  # 识别边缘
cv2.waitKey(0)
imgCanny = cv2.Canny(img, 100, 100)

imgCanny = cv2.Canny(img, 150, 200)  # 值越大边缘越模糊

第四周:Python学习笔记_第32张图片

2.4 dialation(膨胀,扩张):cv2.dilate 增加边缘的厚度(用到numpy)-变厚!

numpy:a library that helps us deal with matrices
install first:
第四周:Python学习笔记_第33张图片

import cv2
import numpy as np

img = cv2.imread(r'E:\Pictures\dir2\han2.png')  # 读取照片
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8)  # 用numpy创建kernel:values=1
#                 大小     类型:unsigned integer of 8-bit。values range from 0-255

imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200)
# iterations叠代次数
# 在显示边缘的基础上扩大边缘
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)


cv2.imshow("Gray Image", imgGray)  # 原版:进行对比
cv2.imshow("Blur Image", imgBlur)  # 模糊版
cv2.imshow("Canny Image", imgCanny)  # 边缘
cv2.imshow("Dialation Image", imgDialation)  # 边缘膨胀扩大

cv2.waitKey(0)

imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)  # 叠代次数为1

第四周:Python学习笔记_第34张图片

imgDialation = cv2.dilate(imgCanny, kernel, iterations=5)  # 叠代次数为5

第四周:Python学习笔记_第35张图片

2.5 erosion(降低):cv2.erode-边缘变细!

import cv2
import numpy as np

img = cv2.imread(r'E:\Pictures\dir2\han2.png')  # 读取照片
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8)  # 用numpy创建kernel:values=1
#                 大小     类型:unsigned integer of 8-bit。values range from 0-255

imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200)
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)
imgEroded = cv2.erode(imgDialation, kernel, iterations=1)  # 变细


cv2.imshow("Gray Image", imgGray)  # 原版:进行对比
cv2.imshow("Blur Image", imgBlur)  # 模糊版
cv2.imshow("Canny Image", imgCanny)  # 边缘
cv2.imshow("Dialation Image", imgDialation)  # 边缘膨胀扩大
cv2.imshow("Eroded Image", imgEroded)  # 边缘变细

cv2.waitKey(0)

第四周:Python学习笔记_第36张图片

3、调整大小和裁剪——RESIZING AND CROPPING

3.0 问题!!

  • 相同的代码为什么png不报错,jpg报错?!!
import cv2
import numpy as np

img = cv2.imread('./粉色.jpg')

cv2.imshow('Image', img)

cv2.waitKey(0)

在这里插入图片描述

3.1 cv2.resize-改变图片大小

import cv2
import numpy as np

img = cv2.imread(r'E:\Pictures\dir2\han2.png')
# ↓返回shape来得知图片的大小:(900, 1600, 3)=(高,宽,ChannelNumber=3(BGR))
print(img.shape)

#                            ↓长  ↓高/宽
imgResize = cv2.resize(img, (500, 300))  # 改变大小
print(imgResize.shape)

cv2.imshow('Image', img)
cv2.imshow('Image Resize', imgResize)

cv2.waitKey(0)

3.2 crop:imgCropped = img[, ]-剪裁

import cv2
import numpy as np

img = cv2.imread(r'E:\Pictures\dir2\han2.png')
print(img.shape)

#                            ↓长  ↓高/宽
imgResize = cv2.resize(img, (500, 300))  # 改变大小
print(imgResize.shape)

#               ↓高/宽     ↓长
imgCropped = img[0:200, 200:500]  # 裁剪

cv2.imshow('Image', img)
# cv2.imshow('Image Resize', imgResize)
cv2.imshow('Image Cropped', imgCropped)

cv2.waitKey(0)

2020.8.3 周日 上午更新第四周:Python学习笔记_第37张图片


4、形状和文本-SHAPES AND TEXTS

import cv2
import numpy as np

# 512*512pixels/boxes+,3=0-255
img = np.zeros((512, 512, 3), np.uint8)
# print(img)
# img[200:300, 100:300] = 255, 0, 0  # 蓝色

cv2.line(img, (0, 0), (img.shape[1], img.shape[0]), (0, 255, 0), 3)
cv2.rectangle(img, (0, 0), (250, 350), (0, 0, 255), 2)  # 最后的2改成cv2.FILLED填充
cv2.circle(img, (400, 50), 30, (255, 255, 0), 5)
#          ↓照片   ↓内容      ↓起始位置    ↓字体                    ↓scale ↓颜色     ↓粗细
cv2.putText(img, "Esther", (300, 100), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 150, 0), 1)

cv2.imshow("Image", img)

cv2.waitKey(0)

第四周:Python学习笔记_第38张图片
2020.8.3 周日 下午
这周的学习内容就到这里了,因为还有别的任务,所以没有学完的库将在后续各自的专属博客中进行跟进和更新
溜了溜了…去忙别的了,5号之后继续学!!!在下一个博客见咯
在这里插入图片描述


(七)汇报中遇到的问题还有可以改进的地方(未完)~

1、上面的Os,shutil库及excel的综合小练习要用os.path.join再写一遍

第四周:Python学习笔记_第39张图片

2、上面的Matplotlib,opencv初探小练习的路径不要写固定,用input输入灵活一些

3、深入了解kernel、dilate和erode等的真正意义

kernel

# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8)  # 用numpy创建kernel:values=1 !!
#                 大小     类型:unsigned integer of 8-bit。values range from 0-255

差操作和另一个对应的操作

# 差操作,先Dialation再Eroded!  光滑/光滑变粗

函数意义

imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# (7, 7): kernal size(卷积):odd number 和机器学习里面的卷积不太一样
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200)  # 值越大边缘越模糊
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)  # 了解参数!!
imgEroded = cv2.erode(imgDialation, kernel, iterations=1)  # 变细

把这个代码吃透

import cv2
import numpy as np

# 读取
img = cv2.imread(r'E:\Pictures\dir2\han2.png')  # 读取照片
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8)  # 用numpy创建kernel:values=1 !!
#                 大小     类型:unsigned integer of 8-bit。values range from 0-255

imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# (7, 7): kernal size(卷积):odd number
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200)  # 值越大边缘越模糊
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)  # 了解参数!!
imgEroded = cv2.erode(imgDialation, kernel, iterations=1)  # 变细
# 差操作,先Dialation再Eroded!  光滑/光滑变粗

# 显示
cv2.imshow("Image", img)  # 彩图
cv2.imshow("Gray Image", imgGray)  # 灰度图
cv2.imshow("Blur Image", imgBlur)  # 模糊版
cv2.imshow("Canny Image", imgCanny)  # 边缘
cv2.imshow("Dialation Image", imgDialation)  # 边缘膨胀扩大
cv2.imshow("Eroded Image", imgEroded)  # 边缘变细

# 保存
cv2.imwrite(r'E:\Competition\saveImg.jpg', img)  # 保存为jpg类型的
cv2.imwrite(r'E:\Competition\saveImg.png', img)
cv2.imwrite(r'E:\Competition\GrayImg.png', imgGray)
cv2.imwrite(r'E:\Competition\BlurImg.png', imgBlur)
cv2.imwrite(r'E:\Competition\CannyImg.png', imgCanny)
cv2.imwrite(r'E:\Competition\DialationImg.png', imgDialation)
cv2.imwrite(r'E:\Competition\ErodedImg.png', imgEroded)

cv2.waitKey(0)

4、dir是directory,path的意思

5、注意“\”在path中对于不同系统的意义

6、os.abspath:绝对路径相对路径的理解

你可能感兴趣的:(笔记)