# 安装 jupyterlab
更换国内源之后,在 anaconda powershell prompt 用下面命令安装
conda install jupyterlab
安装完成后,在命令行输入 jupyter-lab
启动
# numpy 常用命令
命令 | 备注 |
---|---|
np.array([1,2,3,4]) | Python 列表转换为 numpy 的数组 |
np.arange(0,10) | 创建一个 0~9 的一维数组 |
np.ones(shape=(3,3)) | 创建一个大小为 3*3 的全 1 数组 |
np.zeros(shape=(5,5)) | 创建大小为 5*5 的全 0 数组 |
np.random.randint(0,100,10) | 随机 10 个整数 |
arr.max() | 获取最大值 |
arr.argmax() | 获取最大值的索引 |
arr.min() | 获取最小值 |
arr.argmin() | 获取最小值索引 |
arr.mean() | 获取平均值 |
arr.shape | 获取 numpy 数组的大小 |
arr.reshape((5,2)) | 转换数组的形状 |
np.arange(0,100).reshape((10,10)) | 创建一个 10*10 的矩阵 |
# 首先导入 numpy 包,重命名一下 | |
import numpy as np | |
# 首先创建一个 Python 列表 | |
list_c = [1,2,3,4] | |
# 检查类型 | |
type(list_c) | |
# 在使用 np.array () 将 Python 列表转换为 numpy 的数组 | |
my_array = np.array(list_c) | |
# 比如我们使用 np.arange () 可以快速创建连续数字的数组 | |
# 比如我创建一个 0~9 的一维数组 | |
np.arange(0,10) | |
# jupyterlab 中使用 shift+tab 可以查看函数的帮助文档(查看一下,此刻输入 np.arange (),弹出对应函数帮助文档) | |
# 可以看到这个 arange () 函数有 start、stop 和 step 参数,分别代表了起始值,终止值,以及步长 | |
# 如果我希望创建 0~10 中连续偶数的数组,只需将步长设为 2(此刻输入 np.arange (0,10,2)) | |
np.arange(0,10,2) | |
# 还可以用 np.ones 创建全是 1 的数组,(此时输入 np.ones (),弹出帮助说明) | |
# 比如我要创建一个大小为 3*3 的全 1 数组 | |
np.ones(shape=(3,3)) | |
# 或者使用 np.zeros () 全 0 数组 | |
# 比如创建大小为 5*5 的全 0 数组 | |
np.zeros(shape=(5,5)) | |
# 首先使用 np.randint 函数一些随机整数 | |
arr = np.random.randint(0,100,10) | |
# 使用 max 获取最大值 | |
arr.max() | |
# 再使用 argmax () 获取最大值的索引 | |
arr.argmax() | |
# 使用 min 函数获取最小值 | |
arr.min() | |
# 使用 argmin 获取最小值索引 | |
arr.argmin() | |
# 使用 mean () 方法获取取平均值 | |
arr.mean() | |
# 如果要获取 humpy 数组的大小,使用 numpy.shape, | |
arr.shape | |
# 也可以使用 reshape 函数转换数组的形状,比如我将 arr 转换成 5*2 的数组 | |
arr.reshape((5,2)) | |
# 首先创建一个 10*10 的矩阵 | |
matrix = np.arange(0,100).reshape((10,10)) | |
# 查看一下大小 | |
matrix.shape | |
# 使用中括号中加索引方式,获取矩阵对应元素,比如我获取第 3 行第 5 列元素 | |
matrix[2,4] | |
# 再获取矩阵第 9 行第 7 列元素 | |
matrix[8,6] | |
# 如果要获取某一行所有元素,我们需要使用 numpy 的切片: | |
# 比如我要获取第 3 行所有元素,只需将第二个位置变成冒号: | |
matrix[2,:] | |
# 类似的,比如我要获取第 6 列所有元素,只需将第一个位置变成冒号: | |
matrix[:,5] | |
# 查看 shape | |
matrix[:,5].shape | |
# 用 reshape 恢复成原来的样子 | |
matrix[:,5].reshape((10,1)) | |
# 比如我要获取第 1~3 行,第 2~4 列矩阵,我们可以用数字配合冒号的方式来获取 | |
matrix[0:3,1:4] | |
# 当然我们可以使用等号赋值语句,比如我将这些位置赋值 0 | |
matrix[0:3,1:4] = 0 |
# PIL 和 matplotlib 对图像的基本操作
命令 | 备注 |
---|---|
Image.open('./img/cat.jpg') | 读取图片 |
np.asarray(img) | 转化为 numpy 数组 |
plt.imshow(img_arr) | 显示 Numpy 数组形式的图片 |
img_arr.copy() | 复制一份原图 |
plt.imshow(img_arr_copy[:,:,0],cmap='gray') | 将 cmap 颜色设置为 gray 灰度 |
img_arr_copy[:,:,0].shape | 单独看一个通道 |
# 首先导入 numpy | |
import numpy as np | |
# 为了在 notebook 中显示图片,导入 matplotlib 库 | |
import matplotlib.pyplot as plt | |
# 加这行在 Notebook 显示图像 | |
%matplotlib inline | |
# 再使用一个 PIL 库,用于读取图像 | |
from PIL import Image | |
# 我在 img 文件夹下放了一张图片(演示一下) | |
# 我们用 PIL 库读取图片,注意路径要正确 | |
img = Image.open('./img/cat.jpg') | |
# 查看一下变量的类型 | |
type(img) | |
# 首先我们需要将它转化为 numpy 数组,使用 numpy.asarray () 函数 | |
img_arr = np.asarray(img) | |
# 再使用 matplot 的 imshow () 方法显示 Numpy 数组形式的图片 | |
plt.imshow(img_arr) | |
# 我们继续对这个图片操作,先使用 numpy 的 copy 方法复制一份原图 | |
img_arr_copy = img_arr.copy() | |
# 首先使用 numpy 切片,将 R,G,B 三个颜色通道中的 R 红色通道显示出来 | |
# 大家会发现这个颜色很奇怪,都是翠绿色,为什么会显示成这样呢? | |
# 我们打开 matplot 的官网关于颜色表 colormap 的说明: | |
# https://matplotlib.org/stable/gallery/color/colormap_reference.html | |
# 可以看到默认的颜色:是翠绿色(viridis )。那这个颜色方便色盲观看的 | |
plt.imshow(img_arr_copy[:,:,0]) | |
# 我们也可以将 cmap 颜色设置成火山岩浆样式:magma | |
plt.imshow(img_arr_copy[:,:,0],cmap='magma') | |
# 好,我们知道,计算机是分不清到底哪一个通道是红色的,每一个颜色通道其实都是一个灰度图,我们首先将 cmap 颜色设置为 gray 灰度看一下 | |
plt.imshow(img_arr_copy[:,:,0],cmap='gray') | |
# 可以查看大小 shape,会发现大小仍然不变 | |
img_arr_copy.shape | |
# 而单独看一个通道的时候,大小会变化 | |
img_arr_copy[:,:,0].shape |
# OpenCV 对图像和视频的基本操作
命令 | 备注 |
---|---|
cv2.imread('./img/cat.jpg') | 使用 opencv 的 imread 方法,打开图片 |
cv2.cvtColor(img,cv2.COLOR_BGR2RGB) | 将 OpenCV BGR 转换成 RGB |
cv2.imread('./img/cat.jpg',cv2.IMREAD_GRAYSCALE) | 再读取图片时也可以以灰度模式读取 |
cv2.resize(img_fixed,(1000,300)) | 使用 resize 缩放 |
cv2.flip(img_fixed,-1) | 翻转图片:0 表示垂直翻转、1 表示水平翻转,-1 表示水平垂直都翻转 |
cv2.imwrite('./img_flip.jpg',img_save) | 写入 numpy 格式的图片 |
cv2.waitKey(1) & 0xFF == 27 | 等待至少 1ms ,而且按了 ESC 键,也可以用 ord ('q') |
cv2.imshow('display image',img) | 显示图片窗口 |
np.zeros(shape=(800,800,3),dtype=np.int16) | 创建一个纯黑色图,纯黑色就是图片的元素全部为 0,这里给一个数据类型为 Int16 |
cv2.rectangle(img=black_img,pt1=(100,100),pt2=(400,300),color=(0,255,0),thickness=10) | 画一个矩形 |
cv2.rectangle(img=black_img,pt1=(20,550),pt2=(220,750),color=(255,0,0),thickness=10) | 画一个正方形 |
cv2.circle(img=black_img,center=(400,400),radius=100,color=(0,0,255),thickness=10) | 画一个圆 |
cv2.circle(img=black_img,center=(500,600),radius=50,color=(0,0,255),thickness=-1) | 一个实心圆 |
cv2.line(img=black_img,pt1=(0,0),pt2=(800,800),color=(255,0,255),thickness=10) | 画一条线 |
cv2.putText(img=black_img,text="Python",org=(500,150),fontFace=font,fontScale=4,color=(255,0,255),thickness=5,lineType=cv2.LINE_AA) | 添加英文文字 |
cv2.polylines(img=black_img,pts=[pts],isClosed=True,color=(255,0,255),thickness=10) | 画一个多边形 |
cv2.VideoCapture(0) | 读取默认摄像头,后面的数字表示摄像头的编号,如果有多个摄像头可以换成其他数字 |
cv2.destroyAllWindows() | 释放窗口资源 |
cv2.VideoWriter('./myDemoVideo.mp4',cv2.VideoWriter_fourcc(*'X264'),fps,(width,height)) | 存储摄像头视频流 |
cv2.VideoCapture('./myDemoVideo.mp4') | 参数可以换成文件名,我们读取前面保存的 MP4 视频 |
# OpenCV 读取、缩放、翻转、写入图像
# 导入必要的包 | |
import numpy as np | |
import matplotlib.pyplot as plt | |
%matplotlib inline | |
# 导入 opencv | |
import cv2 | |
# 使用 opencv 的 imread 方法,打开图片 | |
img = cv2.imread('./img/cat.jpg') | |
# 检查类型,会发现自动转成了 Numpy 数组的形式 | |
type(img) | |
# 如果打开一张不存在的图片,不会报错,但是会返回空类型 | |
img_wrong = cv2.imread('./img/wrong.jpg') | |
# 为什么会显示的这么奇怪?(OpenCV 和 matplotlib 默认的 RBG 顺序不一样) | |
plt.imshow(img) | |
# matplotlib: R G B | |
# opencv: B G R | |
# 需要调整顺序 | |
# 将 OpenCV BGR 转换成 RGB,cv2.COLOR_可以看到更多转换形式 | |
img_fixed = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) | |
# 显示正常了 | |
plt.imshow(img_fixed) | |
# 另外,我们再读取图片时也可以以灰度模式读取 | |
img_gray = cv2.imread('./img/cat.jpg',cv2.IMREAD_GRAYSCALE) | |
# 只剩 2 个维度,没有了颜色通道 | |
img_gray.shape | |
# 显示这个灰度图 | |
plt.imshow(img_gray,cmap="gray") | |
# 使用 resize 缩放(打开函数帮助) | |
img_resize = cv2.resize(img_fixed,(1000,300)) | |
# 显示缩放后的图片 | |
plt.imshow(img_resize) | |
# 翻转图片:0 表示垂直翻转、1 表示水平翻转,-1 表示水平垂直都翻转 | |
img_flip = cv2.flip(img_fixed,-1) | |
plt.imshow(img_flip) | |
# 先将颜色通道顺序调回 OpenCV 的形式 | |
img_save = cv2.cvtColor(img_flip,cv2.COLOR_RGB2BGR) | |
# 写入 numpy 格式的图片 | |
cv2.imwrite('./img_flip.jpg', img_save) |
# OpenCV 绘制文字和几何图形
# OpenCV 绘制文字和几何图形 | |
# 导入必要的包 | |
import cv2 | |
import numpy as np | |
import matplotlib.pyplot as plt | |
%matplotlib inline | |
# 创建一个纯黑色图,纯黑色就是图片的元素全部为 0,这里给一个数据类型为 Int16 | |
black_img = np.zeros(shape=(800,800,3),dtype=np.int16) | |
# 显示一下 | |
plt.imshow(black_img) | |
# 首先使用 OpenCV 画一个矩形 | |
# 使用 cv2.rectangle 函数来创建,首先看一下这个函数的帮助文档 | |
# 可以看到分别是:thickness(线粗) | |
# 那我们在刚才的黑色图片上创建一个矩形 | |
cv2.rectangle(img=black_img,pt1=(100,100),pt2=(400,300),color=(0,255,0),thickness=10) | |
# 再画一个正方形在左下角 | |
cv2.rectangle(img=black_img,pt1=(20,550),pt2=(220,750),color=(255,0,0),thickness=10) | |
# 在使用 opencv.circle 方法画一个圆 | |
# 看一下帮助文档分别是圆心、半径 | |
cv2.circle(img=black_img,center=(400,400),radius=100,color=(0,0,255),thickness=10) | |
# 换一个实心圆 | |
cv2.circle(img=black_img,center=(500,600),radius=50,color=(0,0,255),thickness=-1) | |
# 再使用 opencv 的 line 函数画一条线,用法和矩形一样 | |
# 我们沿着画面对角线画一条紫色线条 | |
cv2.line(img=black_img,pt1=(0,0),pt2=(800,800),color=(255,0,255),thickness=10) | |
# 我们再使用 OpenCV 添加文字 | |
# 首先是英文 | |
# 定义字体 | |
font = cv2.FONT_HERSHEY_PLAIN | |
# 然后使用 puttext 方法 | |
cv2.putText(img=black_img,text="Python",org=(500,150),fontFace=font,fontScale=4,color=(255,0,255),thickness=5,lineType=cv2.LINE_AA) | |
# 我们再用画一个多边形 | |
# 重新创建一个黑色图 | |
black_img = np.zeros(shape=(800,800,3)) | |
plt.imshow(black_img) | |
# 定义多边形顶点,这些顶点得以二维数据形式存储 | |
points = np.array( [[400,100],[200,300],[400,700],[600,300] ] ,dtype=np.int32) | |
# 然后呢,opencv 比较麻烦,还需转换成三维数组格式 | |
pts = points.reshape((-1,1,2)) | |
# 然后使用 OpenCV 的 polyline 方法创建,注意这里还需要用列表形式把点传过去 | |
cv2.polylines(img=black_img,pts=[pts],isClosed=True,color=(255,0,255),thickness=10) | |
# 再说一下添加中文字体,这个比较麻烦,这里我已经写好了一个函数大家可以直接调用 | |
# 要注意两点: | |
# 1、对应的字体要安装好或者放在目录下 | |
# 2、不像 cv2.puttext 可以直接生效,因为这里用了各种转换,所以需要用一个变量来保存结果 | |
# 导入 PIL 对应包 | |
from PIL import Image, ImageDraw, ImageFont | |
# 定义一个函数 | |
def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30): | |
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) | |
print(type(img)) | |
draw = ImageDraw.Draw(img) | |
# 字体的格式 | |
fontStyle = ImageFont.truetype( | |
"./font/simsun.ttc", textSize, encoding="utf-8") | |
# 绘制文本 | |
draw.text(position, text, textColor, font=fontStyle) | |
# 转换回 OpenCV 格式 | |
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) | |
img_cat = cv2AddChineseText(img_cat, '阿宇', (400,800), textColor=(0, 255, 0), textSize=200) | |
img_cat_fixed = cv2.cvtColor(img_cat,cv2.COLOR_BGR2RGB) | |
plt.imshow(img_cat_fixed) |
# OpenCV 读取摄像头视频流,并显示
""" | |
OpenCV读取摄像头视频流,并显示 | |
类似demo1.py中的显示图片 | |
""" | |
# 导入 OpenCV | |
import cv2 | |
# 使用 VideoCapture,读取默认摄像头,后面的数字表示摄像头的编号,如果有多个摄像头可以换成其他数字 | |
cap = cv2.VideoCapture(0) | |
# 再使用 cap.read () 读取视频流,类似照片,他会以一帧帧的图片返回,所以我们需要用一个循环语句来一直获取 | |
while True: | |
# 返回的是元组 | |
ret,frame = cap.read() | |
# 这里可以把 frame 就当成图片来处理 | |
# 镜像 | |
frame = cv2.flip(frame,1) | |
# 颜色变为灰度 | |
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) | |
# 显示图像 | |
cv2.imshow('demo',gray) | |
# 退出条件: ESC | |
if cv2.waitKey(10) & 0xFF == 27: | |
break | |
cap.release() | |
cv2.destroyAllWindows() |
# OpenCV 读取摄像头视频流,并存储为 MP4 文件
""" | |
OpenCV读取摄像头视频流,并存储为MP4文件 | |
""" | |
# 导入 OpenCV | |
import cv2 | |
# 读取默认摄像头 | |
cap = cv2.VideoCapture(0) | |
# https://docs.opencv.org/4.x/dd/d43/tutorial_py_video_display.html | |
# | |
fps = 20 | |
width = int( cap.get(cv2.CAP_PROP_FRAME_WIDTH)) | |
height = int( cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |
# 这里使用 OpenCV 的 VideoWriter 方法来,我们看一下官网他是如何使用的 | |
# 可以看到第一个参数是文件名,然后是 fourcc 编码,然后是 FPS 帧率,再是画面大小 | |
# 这里需要注意的是 Fourcc 编码,我们再看一下文档,可以看到 | |
# Windows 系统建议用 DIVX 编码 | |
# macOS 系统建议永 MJPG、DIVX、X264 | |
# 推荐用 X264、DIVX,一般 macOS 和 Windows 都试用 | |
# 写法需要注意 *'X264' | |
# | |
# FPS 帧率一般根据摄像头的帧率来填写,比如我的是 20 | |
# 高度、宽度可以自定义,不过我们也可以直接和原画面一样,使用 cap.get 方法获取 | |
writer = cv2.VideoWriter('./myDemoVideo.mp4',cv2.VideoWriter_fourcc(*'X264'),fps,(width,height)) | |
while True: | |
# 读取视频 | |
ret,frame = cap.read() | |
# 这里可以把 frame 就当成图片来处理 | |
# 镜像 | |
frame = cv2.flip(frame,1) | |
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) | |
# 写入画面 | |
writer.write(frame) | |
# 显示图像 | |
cv2.imshow('demo',gray) | |
# 退出条件: ESC | |
if cv2.waitKey(10) & 0xFF == 27: | |
break | |
# 释放句柄 | |
writer.release() | |
cap.release() | |
cv2.destroyAllWindows() |
# OpenCV 读取 mp4 视频文件
""" | |
OpenCV读取mp4视频文件 | |
""" | |
# 导入 OpenCV | |
import cv2 | |
import time | |
# 还是使用 cv2.VideoCapture,只不过参数可以换成文件名,我们读取前面保存的 MP4 视频 | |
cap = cv2.VideoCapture('./myDemoVideo.mp4') | |
# 首先加一个判断,如果文件不存在或编码错误提示 | |
if not cap.isOpened(): | |
print('文件不存在或编码错误') | |
while cap.isOpened(): | |
# 读取帧 | |
ret,frame = cap.read() | |
if ret: | |
# 显示 | |
cv2.imshow('demo',frame) | |
# 降低显示速度(不加这行会显示得特别快) | |
time.sleep(1/20) | |
if cv2.waitKey(1) & 0xFF == ord('q'): | |
break | |
else: | |
break | |
cap.release() | |
cv2.destroyAllWindows() |
# OpenCV 读取摄像头视频视频流,并在画面上绘制文字和图形
""" | |
OpenCV 读取摄像头视频视频流,并在画面上绘制文字和图形 | |
""" | |
# 导入 OpenCV | |
import cv2 | |
import time | |
import drawUtils | |
cap = cv2.VideoCapture(0) | |
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) | |
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |
left_x = width // 2 | |
left_y = height // 2 | |
rect_w = width // 4 | |
rect_h = height // 4 | |
start_time = time.time() | |
while True: | |
# 读取每一帧 | |
ret,frame = cap.read() | |
# 绘制矩形 | |
cv2.rectangle(frame,(left_x,left_y),(left_x+rect_w,left_y+rect_h),(0,255,0),10) | |
# 计算 FPS | |
now = time.time() | |
fps_text = int(1 / ( now - start_time)) | |
start_time = now | |
# 添加中文(首先导入模块) | |
frame = drawUtils.cv2AddChineseText(frame, '帧率:'+str(fps_text), (20,50), textColor=(0, 255, 0), textSize=30) | |
# 显示画面 | |
cv2.imshow('demo',frame) | |
# 退出条件 | |
if cv2.waitKey(10) & 0xFF == 27: | |
break | |
cap.release() | |
cv2.destroyAllWindows() |
""" | |
绘制工具 | |
""" | |
# 导入 PIL 对应包 | |
import cv2 | |
from PIL import Image, ImageDraw, ImageFont | |
import numpy as np | |
# 绘制中文 | |
def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30): | |
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) | |
draw = ImageDraw.Draw(img) | |
# 字体的格式 | |
fontStyle = ImageFont.truetype( | |
"./font/simsun.ttc", textSize, encoding="utf-8") | |
# 绘制文本 | |
draw.text(position, text, textColor, font=fontStyle) | |
# 转换回 OpenCV 格式 | |
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) |