0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用opencv+openpose实现人体姿态检测

新机器视觉 来源:新机器视觉 2023-06-26 10:15 次阅读

利用opencv+openpose实现人体姿态检测,附详细代码。

通过一个偶然机会,我了解到了人体姿态解算,在学习K210之余,我便想着通过opencv实现这个功能,查找了很多资料,发现可以利用opencv+openpose实现,接着我又开始找一些资料,在pycharm上部署。

前言

人体姿态估计的一个有趣应用是 CGI(computer graphic image,一种电影制造技术)应用。如果可以检测出人体姿态,那么图形、风格、特效增强、设备和艺术造型等就可以被加载在人体上。

通过追踪人体姿态的变化,渲染的图形可以在人动的时候“自然”地与人“融合”。姿态估计的一个有趣应用是在交互游戏中追踪人体对象的运动。

比较流行的 Kinect 使用 3D 姿态估计(采用 IR 传感器数据)来追踪人类玩家的运动,从而利用它来渲染虚拟人物的动作。

应用:

用于检测一个人是否摔倒或疾病

用于健身、体育和舞蹈等的自动教学

用于理解全身的肢体语言(如机场跑道信号、交警信号等)

用于增强安保和监控

一、环境配置

pycharm2021.2.2

pycharm是一个很好用的软件,刚开始我们必须要配置相应的环境,当然你使用我主页里那篇模型训练的环境也可以,在你运行的时候系统会提示你缺少了什么环境,并让你安装,你直接安装即可。这里我就不过多的赘述了。

1.导入文件

9d879b94-13b1-11ee-962d-dac502259ad0.png

在pycharm上导入相应的文件后,你可以直接点击运行,系统会提示你缺少了什么环境,缺少什么就安装什么,通过终端使用pip安装即可。

2.具体代码

#TouseInferenceEnginebackend,specifylocationofplugins:
#exportLD_LIBRARY_PATH=/opt/intel/deeplearning_deploymenttoolkit/deployment_tools/external/mklml_lnx/lib:$LD_LIBRARY_PATH
importcv2ascv
importnumpyasnp
importargparse

parser=argparse.ArgumentParser()
parser.add_argument('--input',help='Pathtoimageorvideo.Skiptocaptureframesfromcamera')
parser.add_argument('--thr',default=0.2,type=float,help='Thresholdvalueforposepartsheatmap')
parser.add_argument('--width',default=368,type=int,help='Resizeinputtospecificwidth.')
parser.add_argument('--height',default=368,type=int,help='Resizeinputtospecificheight.')

args=parser.parse_args()

BODY_PARTS={"Nose":0,"Neck":1,"RShoulder":2,"RElbow":3,"RWrist":4,
"LShoulder":5,"LElbow":6,"LWrist":7,"RHip":8,"RKnee":9,
"RAnkle":10,"LHip":11,"LKnee":12,"LAnkle":13,"REye":14,
"LEye":15,"REar":16,"LEar":17,"Background":18}

POSE_PAIRS=[["Neck","RShoulder"],["Neck","LShoulder"],["RShoulder","RElbow"],
["RElbow","RWrist"],["LShoulder","LElbow"],["LElbow","LWrist"],
["Neck","RHip"],["RHip","RKnee"],["RKnee","RAnkle"],["Neck","LHip"],
["LHip","LKnee"],["LKnee","LAnkle"],["Neck","Nose"],["Nose","REye"],
["REye","REar"],["Nose","LEye"],["LEye","LEar"]]

inWidth=args.width
inHeight=args.height

net=cv.dnn.readNetFromTensorflow("graph_opt.pb")

cap=cv.VideoCapture(args.inputifargs.inputelse0)

whilecv.waitKey(1)< 0:
    hasFrame, frame = cap.read()
    if not hasFrame:
        cv.waitKey()
        break

    frameWidth = frame.shape[1]
    frameHeight = frame.shape[0]
    
    net.setInput(cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight), (127.5, 127.5, 127.5), swapRB=True, crop=False))
    out = net.forward()
    out = out[:, :19, :, :]  # MobileNet output [1, 57, -1, -1], we only need the first 19 elements

    assert(len(BODY_PARTS) == out.shape[1])

    points = []
    for i in range(len(BODY_PARTS)):
        # Slice heatmap of corresponging body's part.
        heatMap = out[0, i, :, :]

        # Originally, we try to find all the local maximums. To simplify a sample
        # we just find a global one. However only a single pose at the same time
        # could be detected this way.
        _, conf, _, point = cv.minMaxLoc(heatMap)
        x = (frameWidth * point[0]) / out.shape[3]
        y = (frameHeight * point[1]) / out.shape[2]
        # Add a point if it's confidence is higher than threshold.
        points.append((int(x), int(y)) if conf >args.threlseNone)

forpairinPOSE_PAIRS:
partFrom=pair[0]
partTo=pair[1]
assert(partFrominBODY_PARTS)
assert(partToinBODY_PARTS)

idFrom=BODY_PARTS[partFrom]
idTo=BODY_PARTS[partTo]

ifpoints[idFrom]andpoints[idTo]:
cv.line(frame,points[idFrom],points[idTo],(0,255,0),3)
cv.ellipse(frame,points[idFrom],(3,3),0,0,360,(0,0,255),cv.FILLED)
cv.ellipse(frame,points[idTo],(3,3),0,0,360,(0,0,255),cv.FILLED)

t,_=net.getPerfProfile()
freq=cv.getTickFrequency()/1000
cv.putText(frame,'%.2fms'%(t/freq),(10,20),cv.FONT_HERSHEY_SIMPLEX,0.5,(0,0,0))

cv.imshow('OpenPoseusingOpenCV',frame)

这里便是主函数的代码。

3.效果展示

9d980970-13b1-11ee-962d-dac502259ad0.png

这副图片便是识别的效果,帧率还是很不错的。

三、效果优化

这个帧率虽然可以,但是效果属实有点拉跨。教我K210的学长便指导我进行优化改进,这里附上学长的连接(https://blog.csdn.net/hyayq8124spm=1001.2014.3001.5509)

1.具体代码

importcv2
importtime
importmediapipeasmp
fromtqdmimporttqdm

#导入solution
mp_pose=mp.solutions.pose


mp_drawing=mp.solutions.drawing_utils


pose=mp_pose.Pose(static_image_mode=False,
#model_complexity=1,
smooth_landmarks=True,
#enable_segmentation=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5)


defprocess_frame(img):
#BGR转RGB
img_RGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

results=pose.process(img_RGB)

#可视化
mp_drawing.draw_landmarks(img,results.pose_landmarks,mp_pose.POSE_CONNECTIONS)
#look_img(img)

#mp_drawing.plot_landmarks(results.pose_world_landmarks,mp_pose.POSE_CONNECTIONS)

##BGR转RGB
#img_RGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#
#results=hands.process(img_RGB)

#ifresults.multi_hand_landmarks:#如果有检测到手
#
#forhand_idxinrange(len(results.multi_hand_landmarks)):
#hand_21=results.multi_hand_landmarks[hand_idx]
#mpDraw.draw_landmarks(img,hand_21,mp_hands.HAND_CONNECTIONS)

returnimg

cap=cv2.VideoCapture(1)

#打开cap
cap.open(0)

#无限循环,直到break被触发
whilecap.isOpened():
#获取画面
success,frame=cap.read()
ifnotsuccess:
print('Error')
break

##!!!处理帧函数
frame=process_frame(frame)

#展示处理后的三通道图像
cv2.imshow('my_window',frame)

ifcv2.waitKey(1)in[ord('q'),27]:
break


cap.release()


cv2.destroyAllWindows()

2.效果展示

9dc0803a-13b1-11ee-962d-dac502259ad0.png

总结

到这里这篇文章就结束了,写这篇博客只是单纯记录自己的学习过程。希望看到这篇博客的你,能够更加坚定的学习。胡适说过一句话我觉得特别好,这里分享给大家。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48129

    浏览量

    740178
  • 3D
    3D
    +关注

    关注

    9

    文章

    2756

    浏览量

    106457
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40789

原文标题:实践教程|通过Opencv+Openpose实现人体姿态检测

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【爱芯派 Pro 开发板试用体验】人体姿态估计模型部署前期准备

    Bottom-up类型的。 3、Openpose/lightweight openpose模型 首先要用到的是Openpose模型,这应该是最有名的人体
    发表于 01-01 01:04

    基于openCV的人脸检测系统的设计

    通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库openCV进行人脸检测系统的设计,实现了对出现在视频或图像中的人脸
    发表于 12-23 14:19

    怎么实现基于iNEMO模块的姿态检测及数据传输系统设计?

    怎么实现基于iNEMO模块的姿态检测及数据传输系统设计?
    发表于 05-19 06:06

    如何利用MPU6050进行姿态检测

    与标准方向的夹角绕载体Y 轴旋转可改变利用陀螺仪检测角度最直观的角度检测器就是陀螺仪了,见图 47-3,它可以检测物体绕坐标轴转动的“角速度”,如同...
    发表于 02-10 06:31

    如何对基于RK3399的OPENPOSE进行开发设计呢

    模型下载,建议在PC上做若报cv2.dnn错误,这是opencv版本低的问题,需要升级opencv到3.4.1以上版本(不包含3.4.1), 若报&quot; ValueError
    发表于 06-20 16:53

    openCV边缘检测原理是什么?

    openCV是通过什么原理来实现边缘检测
    发表于 10-10 06:21

    人手姿态检测系统的设计与实现

    为了增强人机交互的交互性以及遥控操作的可控性,设计并实现了一款基于磁场传感器与微加速度计的人手姿态检测系统。利用坐标变换理论,通过磁场传感器数据解算
    发表于 09-09 11:35 66次下载
    人手<b class='flag-5'>姿态</b><b class='flag-5'>检测</b>系统的设计与<b class='flag-5'>实现</b>

    iNEMO模块的姿态检测设计方案

    近年来,MEMS技术的发展开辟了一个全新的技术领域和产业,采用MEMS技术制作的微传感器、微执行器、电力电子器件等在航空、航天、汽车、生物医学、军事等领域中都有着十分广阔的应用前景,同时人体姿态检测
    发表于 10-15 10:40 0次下载
    iNEMO模块的<b class='flag-5'>姿态</b><b class='flag-5'>检测</b>设计方案

    iNEMO模块的特点及用其实现人体姿态检测系统的设计

    本系统提出的算法主要是在加速度计、陀螺仪、磁力计采集人体运动姿态信息的基础上,运用扩展卡尔曼滤波将数据进行融合,得到人体腰部和腿部的角度信息,然后通过大量实验建立与姿态的对应关系,采用
    的头像 发表于 11-16 07:53 3076次阅读
    iNEMO模块的特点及用其<b class='flag-5'>实现</b><b class='flag-5'>人体</b><b class='flag-5'>姿态</b><b class='flag-5'>检测</b>系统的设计

    使用Adaboost算法实现车牌检测OpenCV实现的研究分析

    AdabtxⅪt是一个构建精确分类器的学习算法,在目标检测领域有着广泛的应用。OpenCV是Intel开源计算机视觉库。该文给出了在OpenCV利用Adaboost算法,
    发表于 09-27 17:49 7次下载
    使用Adaboost算法<b class='flag-5'>实现</b>车牌<b class='flag-5'>检测</b>在<b class='flag-5'>OpenCV</b>上<b class='flag-5'>实现</b>的研究分析

    使用Vitis AI和Openpose处理数据以检测跌倒检测

    电子发烧友网站提供《使用Vitis AI和Openpose处理数据以检测跌倒检测.zip》资料免费下载
    发表于 11-17 09:40 0次下载
    使用Vitis AI和<b class='flag-5'>Openpose</b>处理数据以<b class='flag-5'>检测</b>跌倒<b class='flag-5'>检测</b>

    100行Python实现人体肤色检测

    本文中的人体肤色检测功能采用 OpenCV实现OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、
    的头像 发表于 05-06 10:46 495次阅读

    通过Opencv+Openpose实现姿态检测

    通过一个偶然机会,我了解到了人体姿态解算,在学习K210之余,我便想着通过opencv实现这个功能,查找了很多资料,发现可以利用
    的头像 发表于 05-22 10:44 787次阅读
    通过<b class='flag-5'>Opencv+Openpose</b><b class='flag-5'>实现</b>体<b class='flag-5'>姿态</b><b class='flag-5'>检测</b>

    AI深度相机-人体姿态估计应用

    够构建一个可以检测、分析和响应人体运动的应用程序和系统。代码我们的演示视频如下,该视频展示了这项技术的实际功能。您可以看到使用虹科AI深度相机实现人体姿势估计是多
    的头像 发表于 07-31 17:42 617次阅读
    AI深度相机-<b class='flag-5'>人体</b><b class='flag-5'>姿态</b>估计应用

    利用OpenCV进行颜色检测

    关于利用OpenCV进行颜色分类,本文包含了HSV介绍及应用、cv2.inRange及应用、RGB与HSV通道的区别三个方面。
    的头像 发表于 08-18 10:32 857次阅读
    <b class='flag-5'>利用</b><b class='flag-5'>OpenCV</b>进行颜色<b class='flag-5'>检测</b>