pytorch-openpose代码笔记

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]),因为索引02分别对应candidate数组的第一行和第三行的第一列元素。由于index已经是整数类型,astype(int)在这里实际上没有改变其内容,但它确保了代码的健壮性。

13.np.mean(X)

用于计算输入数组(X)沿指定轴的平均值。

14.index = subset[n][np.array(limbSeq[i]) - 1]

np.array(limbSeq[i])-1limbSeq[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.PIPEstderr=subprocess.PIPE参数告诉subprocess.run()将输出和错误输出作为字节流捕获,然后可以通过result.stdoutresult.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
  1. video_file.split("."):这个方法将video_file字符串按.分割成一个列表。例如,如果video_file"example.mp4",那么结果将是['example', 'mp4']

  2. video_file.split(".")[:-1]:通过在分割后的列表上使用切片[:-1],移除了列表中的最后一个元素(即原始文件的扩展名)。因此,如果video_file"example.mp4",这一步的结果将是['example']

  3. ".".join(...):这个方法将上一步得到的列表中的元素用.连接起来,形成一个新的字符串。所以,如果列表是['example'],结果将是"example"

  4. "...".join(...) + ".processed." + postfix:首先,我们将上一步得到的字符串(没有扩展名的原始文件名)与".processed."字符串连接起来。然后,我们再在这个新字符串的末尾添加另一个指定的扩展名(postfix)。例如,如果postfix"avi",那么最终的结果将是"example.processed.avi"

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值