文章目录
第一阶段
1 python
rand、randn、randint
# 随机生成数
import numpy as np
np.random.seed(1)
a = np.random.rand()
print(a) # 0.417022004702574
# 写法2
np.random.seed(1) # 如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
from numpy import random
b = random.rand() # 必须在rand前面再加一次同一个种子才能保证生成的随机数相同
print(b) # 0.417022004702574
# 写法3
from numpy.random import rand
c = rand()
print(c) # 0.7203244934421581
# 创建随机列表
d = rand(4)
# [1.14374817e-04 3.02332573e-01 1.46755891e-01 9.23385948e-02]
print(d)
# 创建随机矩阵
e = rand(2, 4)
print(e)
# [[0.18626021 0.34556073 0.39676747 0.53881673]
# [0.41919451 0.6852195 0.20445225 0.87811744]]
# rand()给定的形状创建一个数组,并在数组中加入在[0,1]之间均匀分布的随机样本。
# randn()以给定的形状创建一个数组,数组元素来符合标准正态分布N(0,1)
# randint() numpy.random.randint(low,high=None,size=None,dtype)
# 生成在半开半闭区间[low,high)上离散均匀分布的整数值;若high=None,则取值区间变为[0,low)
print(np.random.randn(5)) # [ 1.46210794 -2.06014071 -0.3224172 -0.38405435 1.13376944]
print(np.random.randint(5,size=(2,4)))
# [[1 0 4 1]
# [0 0 3 2]]
print(np.zeros((3,4)))
print(np.ones((3,4))) # 注意这两个函数参数是shape,多加一个括号
dict
A = {"1":2, "a":22}
print(A.items()) # dict_items([('1', 2), ('a', 22)])
print(A.keys()) # dict_keys(['1', 'a'])
print(A.values()) # dict_values([2, 22])
print(list(A.items())) # [('1', 2), ('a', 22)]
print(list(A.keys())) # ['1', 'a']
print(list(A.values())) # [2, 22]
print(range(5))
print(range(0, 5))
print(range(0, 5, 1))
print(range(0, 5, 2))
a = [(i, j) for i, j in enumerate(range(5))]
print(a) # [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
b = dict(a)
# 直接写:b = dict([(i, j) for i, j in enumerate(range(5))])
print(b) # {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
npy文件的读写
# .npy文件是numpy专用的二进制文件
arr = np.array([[1, 2], [3, 4]])
# 保存.npy文件
np.save("arr.npy", arr)
# 读取.npy文件
arr1 = np.load("arr.npy")
print(arr1)
xml、yml、json文件的读写
numpy的npz很好用,但是c++不支持。使用opencv函数保存,然后再在c++与python之间交换数据比较方便。
cv2.FileStorage支持 yml,xml,json三种保存格式,可以保存numpy和opencv mat格式。
还可以再附加 .gz 后辍名(例如 abc.yml.gz),自动变成压缩格式,也可读、写
import cv2
import numpy as np
fs = cv2.FileStorage('abc.xml', cv2.FileStorage_WRITE)
# fs = cv2.FileStorage('abc.xml.gz', cv2.FileStorage_WRITE)
# fs = cv2.FileStorage('abc.json', cv2.FileStorage_WRITE)
# fs = cv2.FileStorage('abc.yml', cv2.FileStorage_WRITE)
fs.write('mat2', np.random.randint(0, 10, [2, 2])) # label不要是数字
fs.write('num1', 1)
fs.write('str1', 'abc')
# 关闭文件
fs.release()
fs2 = cv2.FileStorage('abc.xml', cv2.FileStorage_READ)
# fs2 = cv2.FileStorage('abc.xml.gz', cv2.FileStorage_READ)
# fs2 = cv2.FileStorage('abc.json', cv2.FileStorage_READ)
# fs2 = cv2.FileStorage('abc.yml', cv2.FileStorage_READ)
mat2 = fs2.getNode('mat2').mat()
num1 = fs2.getNode('num1').real()
str1 = fs2.getNode('str1').string()
# 关闭文件
fs2.release()
print(mat2)
print(num1)
print(str1)
注意:除了numpy还可以保存cv2.imread()读取进来的opencv mat的格式
p = cv2.imread("DR_ma.png")
f = cv2.FileStorage("p.xml", cv2.FileStorage_WRITE)
f.write("arr", p)
f.release()
fr = cv2.FileStorage("p.xml", cv2.FileStorage_READ)
a = fr.getNode("arr").mat()
cv2.imshow("1", a)
cv2.waitKey(0)
fr.release()
读写csv文件
# 1 方法1
# 1.1 写数据:列表、元组等逗号分隔符
# coding:utf-8
import csv
data = [("1", '软'), ("2", '软'), ("3", '软'), ("4", '软'), ("5", '软')]
f = open('1.csv', 'w')
writer = csv.writer(f)
for i in data:
writer.writerow(i)
f.close()
# 注意:
# # (1)对于乱码可以使用下面语句
# import codecs
# f = codecs.open('222.csv','w','gbk') # 不存在自动换行的问题
# # (2)对于返回结果会出现自动换行
data = [("1", 'a'), ("2", 'a'), ("3", 'a'), ("4", 'b'), ("5", 'dd')]
with open("1.csv", 'w', newline='') as f: # 写了这句话就不用写f.close(), 中文会乱码
writer = csv.writer(f)
for i in data:
writer.writerow(i)
# 1.2 读数据:列表、元组等逗号分隔符
f = open("1.csv", 'r')
reader = csv.reader(f)
for i in reader: # 或者for i in list(reader):
print(i)
# 2 方法2
# 2.1 写数据:字典的写入
import csv
data = {'id': '123', 'name': 'anjing', 'age': '26'}
data1 = {'id': '12323', 'name': 'keyi', 'age': '44'}
# 加入参数“newline=''”
with open('123.csv', 'w', newline='')as f:
fieldnames = {'id', 'name', 'age'}
writer = csv.DictWriter(f, fieldnames=fieldnames) # 写表头
writer.writeheader()
writer.writerow(data)
writer.writerow(data1)
# 2.2 读数据
f1 = open('123.csv', 'r')
reader = csv.DictReader(f1)
for i in reader:
# print(i)
# OrderedDict([('id', '123'), ('age', '26'), ('name', 'anjing')])
# OrderedDict([('id', '12323'), ('age', '44'), ('name', 'keyi')])
print(i['id'], i['name'])
f1.close()
# 注意:也可以直接使用该语句读入reader = csv.reader(f1)
写、读txt文件
# 写入文件
f = open("./1.txt", 'w')
f.write("file_name"+"\n") # 不加换行,下面那句接在这句的后面
f.write("file_name1"+"\n") # 写入必须是str类型
f.write("file_name2"+"\n")
# f.write(1) 直接写入数字是不行的
f.close()
# 读txt文件
f = open("./1.txt", 'r')
f_li = f.readlines()
print(f_li) # ['file_name\n', 'file_name1\n', 'file_name2\n']
f.close()
字符转数字,数字转字符
# string转整数
a = "1.233"
print(float(a)) # 1.233
print(int(float(a))) # 1
# 如果string是整数,int(str)
# 如果string是小数,int(float(str))
#
# 整数、数字转string
a = 99
str1 = "a" + str(a)
str2 = "a{}".format(a)
find函数
a = "123fsdfsdkf"
print(a.find("k")) # 9
print(a.find("f")) # 3
print(a.find("a")) # -1
print(a[9]) # k
# find()如果没有该元素,返回-1,如果存在则返回第一次出现的下标(从0开始算起)
获取矩阵mat元素
print(shapes[0][39, 0]) # 错误print(shapes[0](39, 0))
import numpy as np
b = np.random.rand(3, 5, 2)
print(b)
# [[[0.87894132 0.71210186]
# [0.29442634 0.2830965 ]
# [0.14670712 0.9505772 ]
# [0.64654494 0.11882201]
# [0.93636663 0.06581336]]
# [[0.47807271 0.77892754]
# [0.86550866 0.11489605]
# [0.40793893 0.62676321]
# [0.66120659 0.45707809]
# [0.94441816 0.09942411]]
# [[0.66940067 0.45519547]
# [0.69406268 0.15377414]
# [0.04534706 0.03436059]
# [0.93555508 0.50169304]
# [0.36718846 0.00947385]]]
print(b[0])
# [[0.87894132 0.71210186]
# [0.29442634 0.2830965 ]
# [0.14670712 0.9505772 ]
# [0.64654494 0.11882201]
# [0.93636663 0.06581336]]
print(b[0, 0]) # [0.87894132 0.71210186]
print(b[0][0]) # [0.87894132 0.71210186]与上述效果相同
print(b[1, 0]) # [0.47807271 0.77892754]
import cv2
d = cv2.imread("DR_ma.png") # 图像大小为,1280(宽)*720(高)*3(深)
print(d.shape) # (720, 1280, 3)
print(d[500, 303]) # [23 23 23]
cv2.imshow("1", d)
cv2.waitKey(100)
crop = d[200:520, 500:750] # 起点坐标:x(500, 200);终点坐标:y(750, 520),坐标为(宽,高)
cv2.imshow("2", crop)
cv2.waitKey(100)
os获取文件路径
import os
# 获取当前路径
print(os.getcwd())
print(os.path.abspath(os.path.dirname(__file__)))
print(os.path.abspath(r"."))
# 获取上级目录
print(os.path.abspath(r".."))
# 获取上上级目录
print(os.path.abspath(r"../.."))
# 获取指定路径目录,以及上级、上上级目录
path = ".\\model.png"
print(os.path.dirname(path)) # 当前
print(os.path.abspath(os.path.join(os.path.dirname(path), ".."))) # 上级
print(os.path.abspath(os.path.join(os.path.dirname(path), "../.."))) # 上上级
# path = ".\\path\\"
# print(os.path.dirname(path)) # ".\\path"
# print(os.path.abspath(os.path.join(os.path.dirname(path), ".."))) # ".\\"
# 创建目录
path1 = "./path1"
if not os.path.exists(path1):
os.makedirs(path1)
time
import time
t1 = time.time()
time.sleep(5) # 数字单位为秒
t2 = time.time()
print(t2-t1) # 输出的单位是秒
time1 = time.strftime("%m%d%H%M%S", time.localtime())
time1 = time.strftime("%y%m%d%H%M%S", time.localtime()) # 0201100024
print(time1) # 210201100024
time1 = time.strftime("%Y%m%d%H%M%S", time.localtime()) # 年月日小写,时分秒小写(年大写表示四位,小写表示后两位)
print(time1) # 20210201100042
numpy
创建数组
import numpy as np
a = np.array([0] * 3 + [1] * 6) # [0 0 0 1 1 1 1 1 1]
print(a)
列表和矩阵的最大值获取
li = [[],[]]
li[0] = [1, 2, 3]
li[1] = [2, 4, 5]
print(li)
print(max(li[0])) # ��������
# print(li[0].max()) # 'list' object has no attribute 'max'
import numpy as np
arr = np.array(li)
print(arr[0, :].max())
# print(max(arr)) # û��ȫ�����ֵ
print(max(arr[0, :]))
print(arr.shape)
for i in range(arr.shape[0]):
print("��{}��".format(i))
tmp = arr[i,:]
print(max(tmp))
arr1 = (tmp-tmp.min()+1) / (tmp.max() - tmp.min()+1)
print(arr1)
2 cv2
cv2.imread()
0:cv2.IMREAD_GRAYSCALE
1:cv2.IMREAD_COLOR
png格式保存ushort,16位无符号整型
bmp格式保存uint,8位无符号整型
当需要保存深度图(深度值大于255)时,单通道,使用png格式保存。
读取方式,使用cv2.imread(img, 2),如果使用0读取将会截断超过255部分
返回值: mat=[高、宽、深] = cv2.imread(img)
[高、宽、深] = mat.shape
高=mat.shape[0],宽=mat.shape[1],深=mat.shape[2]
cv2.resize()
import cv2
import numpy as np
img = cv2.imread('dlib_demo/test.jpg')
# INTER_NEAREST 最近邻插值
# INTER_LINEAR 双线性插值(默认设置)
# INTER_AREA 使用像素区域关系进行重采样。
# INTER_CUBIC 4x4像素邻域的双三次插值
# INTER_LANCZOS4 8x8像素邻域的Lanczos插值
print(img.shape)
dst1 = cv2.resize(img, (300, 200))
dst2 = cv2.resize(img, dsize=(int(0.5*img.shape[1]), int(img.shape[0]))) # 改变dsize,dsize是(宽、高)
dst3 = cv2.resize(img, dsize=(0, 0), fx=0.25, fy=0.25) # 改变dx、dy,宽高变成原1/4
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.imshow("dst3", dst3)
cv2.waitKey(0)
# 下面这个方法没有用
# dst0 = img
# cv2.resize(img, (300, 200), dst=dst0)
默认:INTER_LINEAR,即双线性插值法
BGR转RGB
OpenCV 加载的彩色图像是 BGR 模式,但 Matplotib 是 RGB模式。所以彩色图像如果已经被 OpenCV 读入,那它将不会被 Matplotib 正确显示。
1 方法一
b, g, r = cv2.split(img)
img1 = cv2.merge([r, g, b])
2 方法二
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.rectangle()、cv2.putText()和cv2.circle()
x1, x2, y1, y2 = 340, 550, 550, 880
# x1左宽,x2右宽,y1上高,y2下高
w, h = 100, 200
cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 2)
# (255, 0, 0)蓝色bgr, 2框的粗细
cv2.rectangle(img, (x1, y1), (x + w, y + h), (255, 0, 0), 2)
# cv2.putText(img, "true", (x1, y1), cv2.FONT_HERSHEY_COMPLEX, fontScale=2, (0, 255, 0), 2) # 要是在里面添加了形参名,后面的参数也要添加形参
# 图片,添加的文字,左上角坐标,字体,字体大小,颜色bgr,字体粗细
cv2.putText(img, "Face{}".format(123), (x1, y1), cv2.FONT_HERSHEY_COMPLEX, 2, (0, 255, 0), 2)
cv2.circle(img, (x2, y2), 10, (0, 0, 255), -1)
# 当最后一个元素为-1表示圆圈为实心,当大于0时表示圆圈的粗细。10表示圆圈半径