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 2063948923080import 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"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能入门第一篇:简单理解GPU和CPU

目录 1,GPU就是显卡吗2,CPU和GPU到底是什么区别3,CUDA是什么4,为什么人工智能离不开GPU 1,GPU就是显卡吗 ‌不是,显卡和‌GPU是两个相关但不完全相同的概念,GPU是显卡的核心部分,但…

Google Test 学习笔记(简称GTest)

文章目录 一、介绍1.1 介绍1.2 教程 二、使用2.1 基本使用2.1.1 安装GTest (下载和编译)2.1.2 编写测试2.1.3 运行测试2.1.4 高级特性2.1.5 调试和分析 2.2 源码自带测试用例2.3 TEST 使用2.3.1 TestCase的介绍2.3.2 TEST宏demo1demo2 2.3.3 TEST_F宏2.3…

wincc 远程和PLC通讯方案

有 5个污水厂 的数据需要集中监控到1个组态软件上,软件是WINCC。每个污水厂监控系统都是独立的,已经投入运行了, 分站也是WINCC 和西门子PLC 。采用巨控远程模块的话,有两种方式:一种是从现场的PLC取数据,一种是从分站…

2019数字经济公测大赛-VMware逃逸

文章目录 环境搭建漏洞点exp 环境搭建 ubuntu :18.04.01vmware: VMware-Workstation-Full-15.5.0-14665864.x86_64.bundle 这里环境搭不成功。。patch过后就报错,不知道咋搞 发现可能是IDA加载后的patch似乎不行对原来的patch可能有影响,重新下了patch&…

【8月EI会议推荐】第四届区块链技术与信息安全国际会议

一、会议信息 大会官网:http://www.bctis.nhttp://www.icbdsme.org/ 官方邮箱:icbctis126.com 组委会联系人:杨老师 19911536763 支持单位:中原工学院、西安工程大学、齐鲁工业大学(山东省科学院)、澳门…

科大讯飞语音转写demo go语言版

上传了一个语音文件,识别效果。 package audioimport ("bytes""crypto/hmac""crypto/md5""crypto/sha1""encoding/base64""encoding/json""fmt""io/ioutil""net/http"…

【图文详解】Spring是如何解决循环依赖的?

Spring是如何解决循环依赖的呢? 很多小伙伴在面试时都被问到过这个问题,刷到过这个题的同学马上就能回答出来:“利用三级缓存”。面试官接着追问:“哪三级缓存呢?用两级行不行呢?” 这时候如果没有深入研究…

Vs2022+QT+Opencv 一些需要注意的地方

要在vs2022创建QT项目,先要安装一个插件Qt Visual Studio Tools,根据个人经验选择LEGACY Qt Visual Studio Tools好一些,看以下内容之前建议先在vs2022中配置好opencv,配置方式建议以属性表的形式保存在硬盘上。 设置QT路径 打开v…

清华计算几何-算法LowBound和ConvexHull(凸包)-GrahamScan

算法复杂度最低界限LowBound 算法求解复杂度是否存在一个最低界限,有时候想尽一切办法优化一个算法,去优化其复杂度,比如 清华计算几何-ConvexHull(凸包)-求极点InTriangle/ToLeft Test-CSDN博客 清华计算几何-ConvexHull(凸包)-求极边_计…

DeFi革命:揭秘去中心化金融的核心技术与实操指南

目录 DeFi(去中心化金融)综述 基本特点 第一,DeFi 是无许可的金融 第二,DeFi 是无门槛的金融 第三,DeFi 是无人驾驶的金融 典型商业模式 闪电贷 MakerDAO 面临的挑战 DeFi技术要点 椭圆曲线签名 EIP-712:…

模拟依赖关系和 AI 是Vue.js测试的下一个前沿领域

Vue.js 是一个流行的 JavaScript 框架,因此,确保其组件按预期工作至关重要:有效,更重要的是,可靠。模拟依赖项是最有效的测试方法之一,我们将在本文中发现。 模拟依赖项的必要性 模拟依赖项是一种对测试施加…

个人定制化形象生成,FaceChain最新模型部署

FaceChain是阿里巴巴达摩院推出的一个开源的人物写真和个人数字形象的AI生成框架。 FaceChain利用了Stable Diffusion模型的文生图功能,并结合人像风格化LoRA模型训练及人脸相关感知理解模型,将输入的图片进行训练后推理输出生成个人写真图像。 FaceCh…

Live555源码阅读笔记:哈希表的实现(C++)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

算法日记day 20(中序后序遍历序列构造二叉树|最大、合并、搜索二叉树)

一、中序后序序列构造二叉树 题目: 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,…

使用SpringEvent解决WebUploader大文件上传解耦问题

目录 前言 一、SpringEvent涉及的相关组件 1、 事件(Event) 2、事件监听器 3、事件发布器 二、WebUploader大文件处理的相关事件分析 1、事件发布的时机 2、事件发布的代码 三、事件监听器及实际的业务处理 1、文件上传处理枚举 2、文件上传监…

Python+selenium web自动化测试知识点合集2

选择元素 对于百度搜索页面,如果我们想自动化输入“selenium”,怎么做呢? 这就是在网页中,操控界面元素。 web界面自动化,要操控元素,首先需要 选择 界面元素 ,或者说 定位 界面元素 就是 先…

C++客户端Qt开发——界面优化(QSS)

1.QSS 如果通过QSS设置的样式和通过C代码设置的样式冲突,则QSS优先级更高 ①基本语法 选择器{属性名:属性值; } 例如: QPushButton {color: red; } 1>指定控件设置样式 #include "widget.h" #include "ui_widget.h&qu…

qt--做一个拷贝文件器

一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位(自适应) 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类,直接使用静态…

Redis缓存数据库进阶——Redis与分布式锁(6)

分布式锁简介 1. 什么是分布式锁 分布式锁是一种在分布式系统环境下,通过多个节点对共享资源进行访问控制的一种同步机制。它的主要目的是防止多个节点同时操作同一份数据,从而避免数据的不一致性。 线程锁: 也被称为互斥锁(Mu…

Robot Operating System——内部审查(Introspection)Service

大纲 introspection_service检验Parameter值和类型修改内部审查(Introspection)功能的状态完整代码 introspection_client完整代码 测试参考资料 在ROS 2(Robot Operating System 2)中,内部审查(Introspect…