位置: IT常识 - 正文

3D人体骨架检测(mediapipe)(3d人体骨骼模型软件)

编辑:rootadmin
3D人体骨架检测(mediapipe)

推荐整理分享3D人体骨架检测(mediapipe)(3d人体骨骼模型软件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:3d人体骨架检测多少钱,kinect人体骨架检测,3d人体骨架检测多少钱,人体骨架模型3d软件,3d人体骨骼模型软件,3d人体骨架检测多少钱,3d人体骨骼模型软件,3d人体骨骼模型软件,内容如对您有帮助,希望把文章链接给更多的朋友!

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 cv2import mediapipe as mpfrom vpython import *

然后来了解一下mediapipe里骨架预测模块的初始化:  

import cv2import mediapipe as mpfrom vpython import *mp_pose = mp.solutions.pose #从mediapipe里面获取posepose = 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%,则被认为是阳性的。

3D人体骨架检测(mediapipe)(3d人体骨骼模型软件)

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键 breakcam.release() #关掉摄像头cv2.destroyAllWindows() #关掉窗口​

到现在为止,你的代码应该是这样的:

import cv2import mediapipe as mpfrom vpython import *mp_pose = mp.solutions.pose #从mediapipe里面获取posepose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) #初始化mp_drawing = mp.solutions.drawing_utilscam = cv2.VideoCapture(0) #开启摄像头while True: _, frame = cam.read() #获取每一帧 cv2.imshow('real time', frame) #显示每一帧 if cv2.waitKey(1) == ord(q): #检查是否按下q键 breakcam.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 cv2import mediapipe as mpfrom vpython import *mp_pose = mp.solutions.pose #从mediapipe里面获取posepose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) #初始化mp_drawing = mp.solutions.drawing_utilscam = 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键 breakcam.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 cv2import mediapipe as mpfrom vpython import *mp_pose = mp.solutions.pose #从mediapipe里面获取posepose = 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_utilscam = 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键 breakcam.release() #关掉摄像头cv2.destroyAllWindows() #关掉窗口​​​

P.S 后面的操作开始变得骚了,因此我每次操作都会放上一个完整的代码。

我们现在需要让我们的点根据骨骼关节点的x,y,z数值改变:

import cv2import mediapipe as mpfrom vpython import *mp_pose = mp.solutions.pose #从mediapipe里面获取posepose = 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_utilscam = 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键 breakcam.release() #关掉摄像头cv2.destroyAllWindows() #关掉窗口​​​​

再画上连接线:

import cv2import mediapipe as mpfrom vpython import *mp_pose = mp.solutions.pose #从mediapipe里面获取posepose = 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_utilscam = 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键 breakcam.release() #关掉摄像头cv2.destroyAllWindows() #关掉窗口​​​​​

好啦!作品已完成,经过整理后就变成这样了:  

import cv2import mediapipe as mpfrom vpython import *#mediapipe 模型变量初始化def mediapipe_varibles_init(): mp_pose = mp.solutions.pose pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1) mp_drawing = mp.solutions.drawing_utils return 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#在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 = vpython_variables_init()pose, mp_pose, mp_drawing = mediapipe_varibles_init()#打开摄像头,0是第一个摄像头,如果想换一个摄像头请改变这个数字cap = cv2.VideoCapture(0)while True: #获取每一帧的图像 _, f = cap.read() #vpython里的一个函数,用来调整3D中的FPS rate(150) #调用在3D里画出骨架的函数 draw_3d_pose() #在每一帧里画骨架 #显示每一帧 cv2.imshow('real_time', f) #检测是否要关闭窗口 if cv2.waitKey(1) & 0xFF == ord('q'): break#调用窗口关闭函数clos_def()
本文链接地址:https://www.jiuchutong.com/zhishi/300482.html 转载请保留说明!

上一篇:2022年前端Vue常见面试题大全(三万长文)持续更新...(vue前端常见面试题)

下一篇:Web 开发与搜索引擎优化,你应该选择哪一个?(web搜索与挖掘)

  • 微信掉线重新登咋回事(微信掉线重新登录后聊天记录能恢复吗)

    微信掉线重新登咋回事(微信掉线重新登录后聊天记录能恢复吗)

  • 新浪微博账号怎么永久注销(新浪微博账号怎么改名字)

    新浪微博账号怎么永久注销(新浪微博账号怎么改名字)

  • 蓝牙耳机一个有电一个没电怎么充电(蓝牙耳机一个有杂音滋滋滋怎么办)

    蓝牙耳机一个有电一个没电怎么充电(蓝牙耳机一个有杂音滋滋滋怎么办)

  • 快手上每日打卡是咋回事(快手上每日打卡是真的吗)

    快手上每日打卡是咋回事(快手上每日打卡是真的吗)

  • 苹果xs双扬声器设置(iphonexs双扬声器音量 一样大吗)

    苹果xs双扬声器设置(iphonexs双扬声器音量 一样大吗)

  • sdm450是什么处理器(sdm460是什么处理器)

    sdm450是什么处理器(sdm460是什么处理器)

  • 进好友朋友圈不能点赞(进好友朋友圈不让别人看)

    进好友朋友圈不能点赞(进好友朋友圈不让别人看)

  • 红米k20可以无线充电吗(红米k20无线网络老是断开)

    红米k20可以无线充电吗(红米k20无线网络老是断开)

  • 如何清除微信账单记录(如何清除微信账号阿白)

    如何清除微信账单记录(如何清除微信账号阿白)

  • mate30续航多久(mate30续航测评)

    mate30续航多久(mate30续航测评)

  • 苹果视频功能不见了(苹果视频功能不见了怎么恢复)

    苹果视频功能不见了(苹果视频功能不见了怎么恢复)

  • ipad平板可以插耳机吗(iPad平板可以插手机卡的平板能打电话吗)

    ipad平板可以插耳机吗(iPad平板可以插手机卡的平板能打电话吗)

  • 手机桌面快捷方式是啥(手机桌面快捷方式怎么取消)

    手机桌面快捷方式是啥(手机桌面快捷方式怎么取消)

  • 怎么删除vivo云服务相册(怎么删除vivo云端数据)

    怎么删除vivo云服务相册(怎么删除vivo云端数据)

  • win7重装死循环(win7装机失败重启死循环)

    win7重装死循环(win7装机失败重启死循环)

  • 如何改变文件夹的顺序(如何改变文件夹的排序方式,如何筛选显示某类文件)

    如何改变文件夹的顺序(如何改变文件夹的排序方式,如何筛选显示某类文件)

  • emmc和ufs的区别(ufs与emmc区别)

    emmc和ufs的区别(ufs与emmc区别)

  • 小爱同学可以语音唤醒吗(小爱同学可以语音留言吗)

    小爱同学可以语音唤醒吗(小爱同学可以语音留言吗)

  • 滴滴车龄超过8年怎么办(滴滴车龄超过8年可以延期吗)

    滴滴车龄超过8年怎么办(滴滴车龄超过8年可以延期吗)

  • vivox9s如何备份(vivox9怎样备份数据)

    vivox9s如何备份(vivox9怎样备份数据)

  • 小米云恢复的照片在哪(小米云恢复数据到手机)

    小米云恢复的照片在哪(小米云恢复数据到手机)

  • oppok3后壳材质(oppok3手机后壳是塑料的吗)

    oppok3后壳材质(oppok3手机后壳是塑料的吗)

  • oppo reno可以隐藏应用么(opporeno可以隐藏应用吗)

    oppo reno可以隐藏应用么(opporeno可以隐藏应用吗)

  • 美版xsmax支持双卡吗(xsmax美版双卡双待怎么用)

    美版xsmax支持双卡吗(xsmax美版双卡双待怎么用)

  • 怎么关掉拼多多的震动(怎么关掉拼多多物流提醒)

    怎么关掉拼多多的震动(怎么关掉拼多多物流提醒)

  • 电脑每次开机都要磁盘检查是什么原因详情(电脑每次开机都要磁盘检查是什么原因)

    电脑每次开机都要磁盘检查是什么原因详情(电脑每次开机都要磁盘检查是什么原因)

  • NJeeves.exe - NJeeves进程文件是什么意思 有什么用

    NJeeves.exe - NJeeves进程文件是什么意思 有什么用

  • 前端学习之CSS(前端css要掌握到什么程度)

    前端学习之CSS(前端css要掌握到什么程度)

  • 增值税普通发票查询真伪
  • 印花税会计分录最新
  • 小规模商贸公司没有进项可以开发票吗?
  • 收到投资款需要缴纳增值税吗
  • 苗木属于农产品中哪一类
  • 企业之间的借款利息计入什么科目
  • 进口产品不付汇会造成什么
  • 哪些合同不需要缴纳印花税的通知
  • 电影院买电影票怎么买
  • 材料收到发票未到怎么记账
  • 小规模企业可以开电子专用发票吗
  • 增值税已交税金借方有余额
  • 发票收款人和开票人
  • 税收六项减免
  • 地下车库怎么缴费
  • 微软发布Windows 10正式版 新浪
  • 公司借银行款会计分录
  • 新手应该怎么样
  • PHP:mb_convert_case()的用法_mbstring函数
  • 工程预付款抵扣是什么意思
  • 产品生产业务核算工作实训
  • 系统之家u盘重装系统流程
  • 公司购买邮票计入什么科目
  • 未使用的土地使用权可以摊销吗
  • 公允价值变动损益借贷方向增减
  • php foreach as
  • php如何实现分页功能
  • 咨询类公司可以坐零售吗
  • 微信php源码
  • 基于html的旅游网站设计源代码
  • 快速傅里叶变换matlab
  • Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web
  • 报销的时候发票金额大于实际报销的金额
  • 没有初级会计证可以从事会计工作吗
  • 扶贫小额信贷分析报告
  • 劳务费发票 个税
  • 计提的费用收到增值税专票
  • 认证后失控发票管理办法
  • 小程序渲染是什么意思
  • 快递公司账务处理流程及方法总结
  • 织梦适合做什么网站
  • 投资款印花税税源采集表税目
  • 印花税申报时间填错造成逾期怎么办
  • mysql操作步骤
  • 个人出租商铺如何报税申报,需要什么资料
  • 金税四期主要监控的内容
  • 残疾人工资加计扣除包括社保吗
  • 银行电子承兑到期后怎么操作
  • 母公司孙子公司
  • 建筑设计行业收费标准
  • 抵账的车买了什么后果
  • 已付款收货未收货怎么办
  • 仲裁期间公司发工资了怎么办
  • 资产质量的相对性举例说明
  • 建账的依据是什么
  • MySQL数据库同时查询更新同一张表的方法
  • 游戏卡怎么打开
  • winxp关闭自动更新方法
  • 光盘安装系统怎么操作
  • git连接linux服务器
  • w10点击没反应
  • 惠普笔记本win8.1
  • Win7系统电脑开不开机怎么办
  • win10怎么修改桌面图标样式
  • 宽带连接错误628win10
  • jquery搜索页面内容
  • 在shell命令行方式下,一行只能
  • rgb颜色相加
  • css使用教程
  • 内存优化有哪些方法
  • android style文件
  • web开发手机app
  • 泛型类泛型接口泛型方法
  • shell函数写法
  • unity多人联机服务器客户端
  • jquery datatable服务端分页
  • 深入理解新发展理念
  • Android的事件处理机制是一种______机制
  • 如何打印个人缴税记录
  • 跨区域提供建筑安装服务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设