1.cv2.imread(filename, flags)
参数:
filepath:读入imge的完整路径
flags:标志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED}
cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可用1作为实参替代
cv2.IMREAD_GRAYSCALE:读入灰度图片,可用0作为实参替代
cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道,可用-1作为实参替代
PS:alpha通道,又称A通道,是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度复信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明
2.copy.deepcopy()
copy.deepcopy()的用法是将某一个变量的值赋值给另一个变量(此时两个变量地址不同),因为地址不同,所以可以防止变量间相互干扰。
举例:
a = [1, 2, 3] d = a # a和d的地址相同 a[0] = 2 print(d) print(id(a), id(b)) # id() 输出a和d变量的地址 结果: [2, 2, 3] 2063948923080 2063948923080 import copy a = [1, 2, 3] d = copy.deepcopy(a) # a和d的地址不相同 a[0] = 2 print(d) print(id(a), id(d)) 结果: [1, 2, 3] 2793378037960 2793379617288
3.cap = cv2.VideoCapture(0)
参数0表示默认为笔记本的内置第一个摄像头,如果需要读取已有的视频则参数改为视频所在路径路径,如:cap=cv2.VideoCapture('video.mp4')
4.cv2.VideoCapture().set(propId, value)
功能:设置摄像头
举例:
cap=cv2.VideoCapture() cap.set(3, 640) 3表示设置视频流的帧的宽度 cap.set(4, 480) 4表示设置视频流的帧的高度 功能:把视频流的帧的宽度设置为640,视频流的帧的高度为480
5.ret, oriImg = cap.read()
ret, oriImg = cap.read()返回值含义:
ret代表有没有读取到图片 ,为True 或者False
oriImg表示截取到一帧的图片
6.openpose_body_estimation()
输入预测图片进入openpose_body_estimation模型返回结果包含以下数据:
res (dict): 识别结果的列表,列表元素为 dict, 有以下两个字段:
data : 可视化图片内容(numpy.ndarray,BGR格式);
candidate: 图片中所有肢体关键点坐标;
subset: 不同的人不同关键点对应的关键点坐标的索引。
7.Candidate class,中文译为“候选集”,其作用是作为一种特殊的训练集而存在。
在分化出candidate class的过程中,数据处理者需要对原始的数据进行一些处理,为了模型的训练效果更好,需要额外筛选出一部分数据。候选集的诞生时间一般是在数据处理之后,特征工程之前。
8.cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
功能:根据给定的圆心和半径等画圆
img:输入的图片
center:圆心位置
radius:圆的半径
color:圆的颜色
thickness:圆形轮廓的粗细(数值为正)。负厚度表示要绘制实心圆。
lineType: 圆边界的类型。
shift:中心坐标和半径值中的小数位数。
9.np.array()
构造数组
a = [[1,2,3],[4,5,6]] a = np.array(a) #输出: #[[1 2 3] #[4 5 6]]
10.numpy.mean(a, axis, dtype, out,keepdims )
mean()函数功能:求取均值
经常操作的参数为axis,以m * n矩阵举例:
axis 不设置值,对 m*n 个数求均值,返回一个实数
axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
11.numpy的astype(bool)和astype(int)
astype,处理数据作为布尔类型,也就是将数据变成true or false形式
import numpy as np a=[[1,2,1],[2,3,5]] b=[[0,0,0],[2,3,5]] c=np.array(a).astype(bool) d=np.array(b).astype(bool) #结果 #[[True True True] # [True True True]] #[[False False False] # [True True True]]
astype(int),处理数据作为整型类型
import numpy as np a=[[1,2,1],[2,3,5]] b=[[0,0,0],[2,3,5]] c=np.array(a).astype(bool).astype(int) d=np.array(b).astype(bool).astype(int) print(c) print(d) #结果 #[[1 1 1] # [1 1 1]] #[[0 0 0] # [1 1 1]]
12.candidate[index.astype(int), 0]
它执行了一个基于index
数组中指定行的索引操作,并从这些行中选择第一列(索引为0的列)的元素。具体来说,对于index
数组中的每个元素i
,都会从candidate
的第i
行(注意,这里的i
是整数)中选择第一列的值。最终,这会生成一个新的数组或类似数组的结构,包含了所有指定行第一列的值。
import numpy as np candidate = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) index = np.array([0, 2])
candidate[index.astype(int), 0]
将返回np.array([1, 7])
,因为索引0
和2
分别对应candidate
数组的第一行和第三行的第一列元素。由于index
已经是整数类型,astype(int)
在这里实际上没有改变其内容,但它确保了代码的健壮性。
13.np.mean(X)
用于计算输入数组(X
)沿指定轴的平均值。
14.index = subset[n][np.array(limbSeq[i]) - 1]
np.array(limbSeq[i])-1
:limbSeq[i]
首先被转换成NumPy数组。然后对数组中每个元素执行-1
操作,因为数组索引在Python中是从0开始的。
index = subset[n][np.array(limbSeq[i])-1]
:使用调整后的索引(np.array(limbSeq[i])-1
)从subset[n]
中选择元素,并将这个元素赋值给变量index
。
15.length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5
计算两点之间的距离(即两点坐标差的平方开根号)
16.angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1]))
math.atan2(y, x)
,返回从原点 (0,0) 到 (x,y) 点的线段与 x 轴正方向之间的平面角度 (弧度值)。这边求math.atan2(y, x)即求
从 X 轴正方向到点 (x, y)
形成的向量与 X 轴正方向之间的夹角的余角(两角之和为90度)
math.degrees
函数将弧度转换为度。
17.polygon = cv2.ellipse2Poly((int(mY), int(mX)), (int(length / 2), stickwidth), int(angle), 0, 360, 1)
(int(mY), int(mX))
:这是椭圆中心的坐标,其中mY
是y坐标,mX
是x坐标。
(int(length / 2), stickwidth)
:这是椭圆的半主轴长度。第一个值是椭圆长轴的一半,第二个值是椭圆的短轴长度。
int(angle)
:这是椭圆相对于x轴的旋转角度,以度为单位。
0
:这是弧的起始角度,以度为单位。设置为0意味着从椭圆的x轴正方向开始绘制。
360
:这是弧的结束角度,以度为单位。设置为360意味着绘制整个椭圆。
1
:这个参数表示输出的多边形是否闭合。1
表示闭合
18.canvas = cv2.addWeighted(canvas, 0.4, cur_canvas, 0.6, 0)
canvas
:第一个输入图像,它是加权和的结果将要被存储的地方
0.4
:第一个图像的权重。
cur_canvas
:第二个输入图像,它的每个像素值将与第一个图像的像素值进行加权和。
0.6
:第二个图像的权重。
0
:加在加权和上的标量值。
19.ffprobe_result = ffprobe(args.file)
用 ffprobe
工具来查询或分析一个媒体文件(如视频、音频文件)的详细信息。(ffprobe
是 FFmpeg 套件中的一个工具)
20.ffmpeg.input('pipe:',format='rawvideo',pix_fmt="bgr24",s='%sx%s'%(screen_width,screen_height),r=input_fps).output(output_file, pix_fmt=input_pix_fmt, vcodec=input_vcodec)
.overwrite_output()
.run_async(pipe_stdin=True)
设置一个从管道(pipe:
)读取原始视频数据的输入,指定了视频的格式、像素格式、分辨率和帧率。然后将这个处理过的视频数据输出到一个文件中,指定了输出文件的像素格式和视频编解码器。最后,启用了覆盖输出文件的功能,并异步运行了这个命令,同时启用了通过管道标准输入(pipe_stdin=True
)接收数据。
21.self.ff_proc.stdin.write(frame.tobytes())
frame.tobytes()
,调用假定 frame
是一个包含图像数据的对象(如 NumPy 数组),该方法将图像数据转换为字节序列,以便可以写入到 FFmpeg 进程的标准输入中。
frame.tobytes(),将frame转化成比特流格式
self.ff_proc.stdin.write(),向 FFmpeg 的 stdin 写入原始视频经过ff_proc设置的编码格式的帧数据
22.cap.isOpened()
指示视频文件或摄像头是否已成功打开。
23.cap.release()
用于释放视频捕获对象
24.自定义ffprobe(file_path)
command_array = ["ffprobe",
"-v", "quiet",
"-print_format", "json",
"-show_format",
"-show_streams", file_path]
command_array
构建了用于调用ffprobe
并获取媒体文件信息的命令数组。
定义好之后,使用subprocess.run()
函数来执行这个命令,并获取其输出:
result = subprocess.run(command_array, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
subprocess.run()
函数被用来执行ffprobe
命令,并捕获其标准输出(stdout)和标准错误输出(stderr)。stdout=subprocess.PIPE
和stderr=subprocess.PIPE
参数告诉subprocess.run()
将输出和错误输出作为字节流捕获,然后可以通过result.stdout
和result.stderr
访问。
25.info = json.loads(ffprobe_result.json)
作用是将ffprobe
命令执行后的JSON格式的结果转换为Python字典
26.args = parser.parse_args()
作用是解析命令行参数,并将解析的结果存储在一个命名空间中,然后这个命名空间被赋值给变量args
。
27.output_file = ".".join(video_file.split(".")[:-1])+".processed." + postfix
video_file.split(".")
:这个方法将video_file
字符串按.
分割成一个列表。例如,如果video_file
是"example.mp4"
,那么结果将是['example', 'mp4']
。video_file.split(".")[:-1]
:通过在分割后的列表上使用切片[:-1]
,移除了列表中的最后一个元素(即原始文件的扩展名)。因此,如果video_file
是"example.mp4"
,这一步的结果将是['example']
。".".join(...)
:这个方法将上一步得到的列表中的元素用.
连接起来,形成一个新的字符串。所以,如果列表是['example']
,结果将是"example"
。"...".join(...) + ".processed." + postfix
:首先,我们将上一步得到的字符串(没有扩展名的原始文件名)与".processed."
字符串连接起来。然后,我们再在这个新字符串的末尾添加另一个指定的扩展名(postfix
)。例如,如果postfix
是"avi"
,那么最终的结果将是"example.processed.avi"
。