import math
import time as ti
class PoseAnalyzer:
words = ""
def __init__(self,result):
self.points = result['candidate'].astype('int32')
self.index = result['subset'].astype('int32')
def neck_infer_pose(self,point_0,point_1):
# print('由于信息不足,开始预测头部姿态.....')
if (point_0[1].astype('float')-point_1[1])*(point_0[1]-point_1[1])/(point_0[0]-point_1[0])/(point_0[0]-point_1[0]) < 3 :
return False
else:
return True
def advice(self, word):
self.words= self.words+"\n"+word
def cal_ang(self,point_1, point_2, point_3):
"""
根据三点坐标计算夹角
:param point_1: 点1坐标
:param point_2: 点2坐标
:param point_3: 点3坐标
:return: 返回任意角的夹角,这里规定point_2为顶点
"""
a=math.sqrt((point_2[0]-point_3[0])*(point_2[0]-point_3[0])+(point_2[1]-point_3[1])*(point_2[1] - point_3[1]))
b=math.sqrt((point_1[0]-point_3[0])*(point_1[0]-point_3[0])+(point_1[1]-point_3[1])*(point_1[1] - point_3[1]))
c=math.sqrt((point_1[0]-point_2[0])*(point_1[0]-point_2[0])+(point_1[1]-point_2[1])*(point_1[1]-point_2[1]))
# A=math.degrees(math.acos((a*a-b*b-c*c)/(-2*b*c)))
B=math.degrees(math.acos((b*b-a*a-c*c)/(-2*a*c)))
# C=math.degrees(math.acos((c*c-a*a-b*b)/(-2*a*b)))
if B > 180:
B = 360-B
return B
def logic_realize(self,neck=120,waist=80,infer=True):
'''
:监测颈部和腰部姿态
:默认颈部夹角大于120度,腰部夹角大于80度为合格姿态,此参数可供用户自定义
:infer,当图片内容包含的信息不足以计算人体姿态时,是否推测人体姿态,默认开启
返回值:
第一部分(bool): 颈部,腰部,左膝盖,右膝盖姿态,正确(True),错误(False)
第二部分(time):本次执行判断的对应的时间,用于生成日志
'''
print(2.1)
p0 = self.index[0,0]
p1 = self.index[0,1]
p8 = self.index[0,8]
p9 = self.index[0,9]
p10 = self.index[0,10]
p11 = self.index[0,11]
p12 = self.index[0,12]
p13 = self.index[0,13]
print(2.2)
# print(p8)
# print(self.points[p8,:2],"________________________")
waist_angle = 0
neck_angle = 0
left_knee_angle = 0
right_knee_angle = 0
re_neck = False
re_waist = False
re_left_knee = False
re_right_knee = False
if self.index.shape[0] == 1: # 此处暂行只判断单人场景
'''头部角度计算'''
if p8 != -1 and p1 != -1 and p0 != -1:
neck_angle = self.cal_ang(self.points[p8,:2],self.points[p1, :2], self.points[p0, :2])
else:
pass
# self.advice("该图检测颈部姿态的关键点信息不足")
# print("该图检测颈部姿态的关键点信息不足")
'''腰部角度计算'''
# 若能够同时识别腰部两个关键点
# 则以两点中心点作为point_2
if p9 != -1 and p8 != -1 and p1 != -1 and p11 != -1 :
waist_angle = self.cal_ang(self.points[p9,:2],self.points[p8,:2],self.points[p1,:2])/2 + \
self.cal_ang(self.points[p9,:2],self.points[p11,:2],self.points[p1,:2])/2
elif p9 != -1 and p8 != -1 and p1 != -1 :
waist_angle = self.cal_ang(self.points[p9,:2],self.points[p8,:2],self.points[p1,:2])
elif p9 != -1 and p11 != -1 and p1 != -1:
waist_angle = self.cal_ang(self.points[p9,:2],self.points[p11,:2],self.points[p1,:2])
else:
pass
# self.advice("该图检测腰部姿态的关键点信息不足")
# print("该图检测腰部姿态的关键点信息不足")
'''膝盖角度'''
if p8 != -1 and p9 != -1 and p10 != -1 :
# 左脚(也许)
left_knee_angle = self.cal_ang(self.points[p8,:2],self.points[p9,:2],self.points[p10,:2])
else:
pass
# self.advice("该图检测左膝姿态的关键点信息不足")
# print("该图检测左膝姿态的关键点信息不足")
if p11 != -1 and p12 != -1 and p13 != -1 :
# 右脚
right_knee_angle = self.cal_ang(self.points[p11,:2],self.points[p12,:2],self.points[p13,:2])
else:
pass
# self.advice("该图检测右膝姿态的关键点信息不足")
# print("该图检测右膝姿态的关键点信息不足")
# elif (多人)
# print(neck_angle,"yes")
# print("颈部夹角 ", neck_angle)
# print("腰部夹角 ", waist_angle)
# print("左膝角度 {}, 右膝角度 {}".format(left_knee_angle,right_knee_angle))
# print("------------------------------------------------")
# 逻辑判断 脖子
if neck_angle <120 and neck_angle != 0:
self.advice("脖子没了")
# print('头抬高一点')
# 信息不足开始推测
elif neck_angle == 0 and infer == True :
infer = self.neck_infer_pose(self.points[p0,:2],self.points[p1,:2])
if infer==True:
pass
else:
self.advice("头抬高一点")
# print('头抬高一点')
else:
# self.advice("头部姿态正确")
# print('头部姿态正确')
re_neck = True
# 腰部
if waist_angle <80 and waist_angle != 0:
self.advice("挺直腰背")
# print("挺直腰背")
else:
# self.advice("腰部姿态正确")
# print('腰部姿态正确')
re_waist = True
# 膝盖
if left_knee_angle < 100 and left_knee_angle >70 :
self.advice("左膝姿态错误")
# print('左膝姿态错误')
else:
re_left_knee = True
if right_knee_angle < 100 and right_knee_angle >70 :
self.advice("右膝姿态错误")
# print('右膝姿态错误')
else:
re_right_knee = True
if re_right_knee == True and re_left_knee == True:
pass
# self.advice("膝盖姿态正确")
# print('膝盖姿态正确')
time = ti.strftime("%Y-%m-%d %H:%M:%S", ti.localtime())
return self.words
# return re_neck,re_waist,re_left_knee,re_right_knee,time
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
<项目介绍> 课程作业基于Python实现的摄像头对坐姿实时检测源码+超详细注释 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
资源推荐
资源详情
资源评论
收起资源包目录
body_estimation_withcamera-master.zip (3个子文件)
body_estimation_withcamera-master
caculate_angle.py 7KB
main.py 980B
show_infor.py 997B
共 3 条
- 1
资源评论
.Android安卓科研室.
- 粉丝: 4302
- 资源: 2393
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MATLAB实现绘制NURBS曲线程序源码
- 处理word文档,解析文档格式、图片、表达式、表格-doc、docx篇
- C#微信营销平台源码 微信营销后台管理系统源码数据库 文本存储源码类型 WebForm
- 技术资料分享65C02汇编指令集很好的技术资料.zip
- 课程作业《用51单片机实现的红外人体检测装置》+C语言项目源码+文档说明
- app自动化小白之appium环境安装
- 课程设计-哲学家就餐问题(并发算法问题)-解决策略:资源分级、最多允许四个哲学家同时拿筷子、服务员模式、尝试等待策略
- C#大型公司财务系统源码 企业财务管理系统源码数据库 SQL2008源码类型 WebForm
- MDK文件编译配套工程
- java项目,课程设计-ssm企业人事管理系统ssm.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功