3D人体骨架检测(mediapipe)
m
在本教程中,我们将学习如何使用python中的mediapipe库进行实时3D骨架检测。
首先,我们得用pip下载下来我们需要用到的模组:
pip install mediapipe
这个工具不仅得到了谷歌的支持,而且Mediapipe中的模型也被积极地用于谷歌产品中。因此,这个模组,超级牛皮。
现在,MediaPipe的姿势检测是高保真(高质量)和低延迟(超快)的最先进的解决方案,用于在低端设备(即手机,笔记本电脑等)的实时视频源中检测一个人的33个3D地标。
pip install opencv-python
Opencv-python简称cv2, 是一个超级牛皮的模组(比mediapipe还牛皮),他可以打开你的摄像头,并且还能回去每一帧的图像并显示出来(详情请见opencv的教程),关键是,cv2还有C++和Java版的。
pip install numpy
Numpy, 为矩阵计算而生,是一个专门计算矩阵的模组,cv2会用到它。
pip install vpython
大家应该不是那么的熟悉这个模组,用来在3D中布点的。但是因为简洁且迅速的更新速度,让我选择了这个模组(主要是因为害怕会掉帧)
P.S python需要定在python 3.0 以上
接下来,就是骨架预测的操作。
首先,导入所有我们需要的模组:
import cv2
import mediapipe as mp
from vpython import *
然后来了解一下mediapipe里骨架预测模块的初始化:
import cv2
import mediapipe as mp
from vpython import *
mp_pose = mp.solutions.pose #从mediapipe里面获取pose
pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) #初始化
Static_image_mode -这是一个布尔值,如果设置为False,检测器只在需要时调用,在第一帧或当跟踪器丢失跟踪时。如果设置为True,则对每个输入图像调用人员检测器。当你处理一堆不相关的图像而不是视频时,你应该把这个设为True。默认值为False。
Min_detection_confidence—考虑骨架检测模型的预测正确性所需的最小检测置信范围(0.0,1.0)。默认值为0.5。这意味着如果一个检测器的预测置信度大于或等于50%,则被认为是阳性的。
Min_tracking_confidence -这是骨架关节点跟踪模型为了有效跟踪地标的姿态,需要考虑的最小跟踪置信度([0.0,1.0])。如果置信度小于设定值,则在下一帧/图像中再次调用检测器,因此增加其值会增加稳定性,但也会造成延迟。默认值为0.5。
Model_complexity—骨架检测模型的复杂性。由于有三种不同的模型可供选择,可能的值为0、1或2。值越高,结果越准确,但代价是延迟越长。缺省值为1。
Smooth_landmarks -这是一个布尔值,如果设置为True,将过滤不同帧的骨架关节点以减少噪音。只有当static_image_mode也设置为False时,这才有效。默认值为True。
mp_drawing = mp.solutions.drawing_utils
mp_drawing 是为了可视化关节点于它们之间的关系初始化的
然后,咱们来搞一下摄像头的初始化:
cam = cv2.VideoCapture(0) #开启摄像头
while True:_, frame = cam.read() #获取每一帧cv2.imshow('real time', frame) #显示每一帧if cv2.waitKey(1) == ord(q): #检查是否按下q键break
cam.release() #关掉摄像头
cv2.destroyAllWindows() #关掉窗口
到现在为止,你的代码应该是这样的:
import cv2
import mediapipe as mp
from vpython import *
mp_pose = mp.solutions.pose #从mediapipe里面获取pose
pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) #初始化
mp_drawing = mp.solutions.drawing_utils
cam = cv2.VideoCapture(0) #开启摄像头
while True:_, frame = cam.read() #获取每一帧cv2.imshow('real time', frame) #显示每一帧if cv2.waitKey(1) == ord(q): #检查是否按下q键break
cam.release() #关掉摄像头
cv2.destroyAllWindows() #关掉窗口
现在,我们将使用函数 mp.solutions.pose.Pose().process()
将图像传递到姿势检测机器学习管道。但是管道需要RGB
颜色格式的输入图像,因此首先我们必须使用函数cv2.cvtColor()将示例图像从BGR
转换为RGB
格式,因为OpenCV以BGR
格式(而不是RGB)
读取图像:
results = pose.process(cv2.cvtColor(f, cv2.COLOR_BGR2RGB))
执行姿势检测后,我们将获得三十三个地标的列表,这些地标代表图像中突出人物的身体关节位置。每个地标都有:
x
– 它是按图像宽度归一化为 [0.0, 1.0] 的地标 x 坐标。y
:它是按图像高度归一化为 [0.0, 1.0] 的地标 y 坐标。z
:它是归一化为与 x 大致相同的比例的地标z 坐标
。它表示以臀部中点为原点的地标深度,因此 z 的值越小,地标离相机越近。可见性
:它是一个范围为 [0.0, 1.0] 的值,表示地标在图像中可见(未遮挡)的可能性。在决定是否要显示特定关节时,这是一个有用的变量,因为它可能在图像中被遮挡或部分可见。
但是,我们现在只需要x,y和z。
接下来,我们需要显示它们的位置,并画上线:
mp_drawing.draw_landmarks(image=f, landmark_list=results.pose_landmarks, connections=mp_pose.POSE_CONNECTIONS)
运行一下,你的代码应该是这样的:
import cv2
import mediapipe as mp
from vpython import *
mp_pose = mp.solutions.pose #从mediapipe里面获取pose
pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) #初始化
mp_drawing = mp.solutions.drawing_utils
cam = cv2.VideoCapture(0) #开启摄像头
while True:_, frame = cam.read() #获取每一帧
results = pose.process(cv2.cvtColor(f, cv2.COLOR_BGR2RGB)) #检查每一帧中的骨架关节点mp_drawing.draw_landmarks(image=f, landmark_list=results.pose_landmarks, connections=mp_pose.POSE_CONNECTIONS) #画上关节点cv2.imshow('real time', frame) #显示每一帧if cv2.waitKey(1) == ord(q): #检查是否按下q键break
cam.release() #关掉摄像头
cv2.destroyAllWindows() #关掉窗口
现在,一大半已经搞完了,现在只需要搞定在3D中的显示。
points = []c = []
for x in range(33):points.append(sphere(radius=5, pos=vector(0, -50, 0)))c.append(curve(retain=2, radius=4))
sphere 是用来布点的。
curve 是用来连接各个点的。
import cv2
import mediapipe as mp
from vpython import *
mp_pose = mp.solutions.pose #从mediapipe里面获取pose
pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) #初始化
points = []c = []
for x in range(33):points.append(sphere(radius=5, pos=vector(0, -50, 0)))c.append(curve(retain=2, radius=4))
mp_drawing = mp.solutions.drawing_utils
cam = cv2.VideoCapture(0) #开启摄像头
while True:_, frame = cam.read() #获取每一帧
results = pose.process(cv2.cvtColor(f, cv2.COLOR_BGR2RGB)) #检查每一帧中的骨架关节点mp_drawing.draw_landmarks(image=f, landmark_list=results.pose_landmarks, connections=mp_pose.POSE_CONNECTIONS) #画上关节点cv2.imshow('real time', frame) #显示每一帧if cv2.waitKey(1) == ord(q): #检查是否按下q键break
cam.release() #关掉摄像头
cv2.destroyAllWindows() #关掉窗口
P.S 后面的操作开始变得骚了,因此我每次操作都会放上一个完整的代码。
我们现在需要让我们的点根据骨骼关节点的x,y,z数值改变:
import cv2
import mediapipe as mp
from vpython import *
mp_pose = mp.solutions.pose #从mediapipe里面获取pose
pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) #初始化
points = []c = []
for x in range(33):points.append(sphere(radius=5, pos=vector(0, -50, 0)))c.append(curve(retain=2, radius=4))
mp_drawing = mp.solutions.drawing_utils
cam = cv2.VideoCapture(0) #开启摄像头
while True:_, frame = cam.read() #获取每一帧
results = pose.process(cv2.cvtColor(f, cv2.COLOR_BGR2RGB)) #检查每一帧中的骨架关节点if results.pose_world_landmarks:for i in range(11, 33):if i != 18 and i!=20 and i!= 22 and i != 17 and i!=19 and i!=21:points[i].pos.x = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].x * -cap.get(3)points[i].pos.y = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].y * -cap.get(4)points[i].pos.z = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].z * -cap.get(3)mp_drawing.draw_landmarks(image=f, landmark_list=results.pose_landmarks, connections=mp_pose.POSE_CONNECTIONS) #画上关节点cv2.imshow('real time', frame) #显示每一帧if cv2.waitKey(1) == ord(q): #检查是否按下q键break
cam.release() #关掉摄像头
cv2.destroyAllWindows() #关掉窗口
再画上连接线:
import cv2
import mediapipe as mp
from vpython import *
mp_pose = mp.solutions.pose #从mediapipe里面获取pose
pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) #初始化
points = []
ids = [[12, 14, 16], [11, 13, 15], [12, 24, 26, 28, 30, 32, 28],[11, 23, 25, 27, 29, 31, 27], [12, 11], [24, 23]]
c = []
for x in range(33):points.append(sphere(radius=5, pos=vector(0, -50, 0)))c.append(curve(retain=2, radius=4))
mp_drawing = mp.solutions.drawing_utils
cam = cv2.VideoCapture(0) #开启摄像头
while True:_, frame = cam.read() #获取每一帧
results = pose.process(cv2.cvtColor(f, cv2.COLOR_BGR2RGB)) #检查每一帧中的骨架关节点if results.pose_world_landmarks:for i in range(11, 33):if i != 18 and i!=20 and i!= 22 and i != 17 and i!=19 and i!=21:points[i].pos.x = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].x * -cap.get(3)points[i].pos.y = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].y * -cap.get(4)points[i].pos.z = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].z * -cap.get(3)for n in range(2):for i in range(2):c[i + 2 * n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),vector(points[ids[n][i + 1]].pos.x, points[ids[n][i + 1]].pos.y,points[ids[n][i + 1]].pos.z), retaine=2)for n in range(2, 4):for i in range(6):c[i+6*n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),vector(points[ids[n][i +1]].pos.x, points[ids[n][i + 1]].pos.y, points[ids[n][i+1]].pos.z), retaine = 2)for n in range(4, 6):for i in range(1):c[i+2*n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),vector(points[ids[n][i +1]].pos.x, points[ids[n][i + 1]].pos.y, points[ids[n][i+1]].pos.z), retaine = 2)mp_drawing.draw_landmarks(image=f, landmark_list=results.pose_landmarks, connections=mp_pose.POSE_CONNECTIONS) #画上关节点cv2.imshow('real time', frame) #显示每一帧if cv2.waitKey(1) == ord(q): #检查是否按下q键break
cam.release() #关掉摄像头
cv2.destroyAllWindows() #关掉窗口
好啦!作品已完成,经过整理后就变成这样了:
import cv2
import mediapipe as mp
from vpython import *
#mediapipe 模型变量初始化(你教我的,要整理变量)
def mediapipe_varibles_init():mp_pose = mp.solutions.posepose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1)mp_drawing = mp.solutions.drawing_utilsreturn pose,mp_pose, mp_drawing
#vpython(三维画图)模型变量初始化
def vpython_variables_init():points = []boxs = []ids = [[12, 14, 16], [11, 13, 15], [12, 24, 26, 28, 30, 32, 28],[11, 23, 25, 27, 29, 31, 27], [12, 11], [24, 23]]c = []for x in range(33):points.append(sphere(radius=5, pos=vector(0, -50, 0)))c.append(curve(retain=2, radius=4))return points, boxs, ids, c, hpointsr, hpointsl
#在3D里画出骨架的函数
def draw_3d_pose():results = pose.process(cv2.cvtColor(f, cv2.COLOR_BGR2RGB))if results.pose_world_landmarks:for i in range(11, 33):if i != 18 and i!=20 and i!= 22 and i != 17 and i!=19 and i!=21:points[i].pos.x = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].x * -cap.get(3)points[i].pos.y = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].y * -cap.get(4)points[i].pos.z = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].z * -cap.get(3)for n in range(2):for i in range(2):c[i + 2 * n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),vector(points[ids[n][i + 1]].pos.x, points[ids[n][i + 1]].pos.y,points[ids[n][i + 1]].pos.z), retaine=2)for n in range(2, 4):for i in range(6):c[i+6*n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),vector(points[ids[n][i +1]].pos.x, points[ids[n][i + 1]].pos.y, points[ids[n][i+1]].pos.z), retaine = 2)for n in range(4, 6):for i in range(1):c[i+2*n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),vector(points[ids[n][i +1]].pos.x, points[ids[n][i + 1]].pos.y, points[ids[n][i+1]].pos.z), retaine = 2)mp_drawing.draw_landmarks(image=f, landmark_list=results.pose_landmarks, connections=mp_pose.POSE_CONNECTIONS)
#窗口关闭函数
def clos_def():cap.release()cv2.destroyAllWindows()
#获取变量
points, boxs, ids, c, hpointsr, hpointsl = vpython_variables_init()
pose, mp_pose, mp_drawing = mediapipe_varibles_init()
#打开摄像头,0是第一个摄像头,如果想换一个摄像头请改变这个数字
cap = cv2.VideoCapture(0)
while True:#获取每一帧的图像_, f = cap.read()#vpython里的一个函数,用来调整3D中的FPSrate(150)#调用在3D里画出骨架的函数draw_3d_pose()#在每一帧里画骨架#显示每一帧cv2.imshow('real_time', f)#检测是否要关闭窗口if cv2.waitKey(1) & 0xFF == ord('q'):break
#调用窗口关闭函数
clos_def()
3D人体骨架检测(mediapipe)相关推荐
- 动态多尺度图表达3D人体骨架运动,实现精准预测效果超SOTA
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 现有的基于3D人体骨架的运动预测方法往往不考虑身体不同部位之间的关 ...
- 基于MindStudio的3D人体关键点检测
3D人体关键点检测 1 任务介绍 人体关键点检测插件基于 MindX SDK 开发,在昇腾芯片上进行人体关键点和骨架检测,将检测结果可视化并保存.输入一幅图像,可以检测得到图像中所有行人的关键点并连接 ...
- VideoPose3D:基于视频的3D人体关键点检测
1. 概述 Dario Pavllo等人于2019年提出了VideoPose3D模型,旨在把输入视频转换成人体各关键点相对于根关节的相对三维位置.为了实现这一目的,作者采取的是两步走的策略.首先要利用 ...
- CVPR2020 Oral | 动态多尺度图表达3D人体骨架运动,实现精准预测效果超SOTA
新智元推荐 编辑:白峰 [新智元导读]上海交大.三菱电机实验室联合提出将人体骨架建模为一个可学习的多尺度图,并且对不同层次的特征,多尺度图呈现动态变化.通过学习综合的多尺度特征表达,DMGNN ...
- 基于人体骨架检测的安全警戒线
文章目录 背景 方法 人体骨架提取 空间关系分析 背景 在校园安防中学生安全是第一位的,在本篇博文中,将简单介绍一个小demo,楼道栏杆安全检测. 方法 第一步骨架提取,第二步人体骨架关键部位与栏杆的 ...
- 行为识别 人体骨架检测+LSTM
转自http://geek.csdn.net/news/detail/138011 在人工智能研究领域,这一技能叫人体行为识别,是智能监控.人机交互.机器人等诸多应用的一项基础技术.以电影提到的老人智 ...
- 2D人体骨架检测算法综述
文章目录 多人关键点检测 多人2d关键点检测的算法(自下而上) 1.OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affi ...
- yolov7 姿态识别-人体骨架-实时检测+实例分割
(15条消息) YOLOv7实例分割_迷途小书童的Note的博客-CSDN博客https://blog.csdn.net/djstavaV/article/details/126357677 (15条 ...
- Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)
目录 1.人体姿态估计简介 2.人体姿态估计数据集 3.OpenPose库 4.实现原理 5.实现神经网络 6.实现代码 1.人体姿态估计简介 人体姿态估计(Human Posture Estimat ...
- 3D 人体姿态估计简述
0 前言 3D Human Pose Estimation(以下简称 3D HPE )的目标是在三维空间中估计人体关键点的位置.3D HPE 的应用非常广泛,包括人机交互.运动分析.康复训练等,它也可 ...
最新文章
- 让织梦内容页arclist标签的当前文章标题加亮显示
- 使用iText库创建PDF文件
- mysql+永久+关闭提交,MySQL学习【第十一篇存储引擎之事务解释】
- 抽象工厂和工厂方法示例_抽象工厂设计模式示例
- java开发 职业技能_java编程开发程序员需要具备哪些职业技能
- 2021年香河一中高考成绩查询,2021年廊坊高考状元名单公布,廊坊文理科状元是谁多少分...
- Java编程技术_10个实用的但偏执的Java编程技术
- java 执行oracle命令_利用oracle存储过程执行操作系统命令
- [转]ie6下CSS存在的BUG
- RPM部署MYSQL
- 因子分析法基于matlab,因子分析matlab
- HTML中怎么改变一条线的粗细
- 新颖的 USB HUB快充方案助您无忧!!(兼容PD、QC、AFC等快充协议)
- 软件测试---前言篇
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))...
- JAVA中BitSet使用
- 雷锋网专访陌陌产品总监雷小亮
- SOCKET学习第三阶段(SELECT模型)
- 斗地主中自主出牌的游戏逻辑
- 2023 源支付码支付系统源码v3.0 二开修复版 全本地化
热门文章
- 爱奇艺发布年报:四季度运营大幅减亏,今年提质增效追盈利
- MTK6577---camera驱动分析
- 干货丨看金仓数据库如何支持透明加密!
- oracle查询 相关的表,Oracle 查询用户,表,受权相关语句
- 车架号校验 php代码,VIN车辆识别代码查询
- 虚拟桌面更新,自定义快捷键
- 企业长期偿债能力评估-利息收入倍数、财务杠杆比率、资产负债率、利息保障倍数、债务股本比率...
- 12. JLINK在线调试+软件调试方法与技巧
- 网站SEO优化的关键词密度怎么布局才算合理
- 8瓶药水3只小白鼠问题