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

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

3天内不再提示

通过Opencv+Openpose实现体姿态检测

新机器视觉 来源:CSDN博主我与nano 2023-05-22 10:44 次阅读

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

前言

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

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

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

应用:

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

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

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

用于增强安保和监控

一、环境配置

pycharm2021.2.2

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

1.导入文件

07251b6c-f77e-11ed-90ce-dac502259ad0.png

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

需要的留下邮箱即可,我发给你。

2.具体代码

# To use Inference Engine backend, specify location of plugins:
# export LD_LIBRARY_PATH=/opt/intel/deeplearning_deploymenttoolkit/deployment_tools/external/mklml_lnx/lib:$LD_LIBRARY_PATH
import cv2 as cv
import numpy as np
import argparse


parser = argparse.ArgumentParser()
parser.add_argument('--input', help='Path to image or video. Skip to capture frames from camera')
parser.add_argument('--thr', default=0.2, type=float, help='Threshold value for pose parts heat map')
parser.add_argument('--width', default=368, type=int, help='Resize input to specific width.')
parser.add_argument('--height', default=368, type=int, help='Resize input to specific height.')


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.input if args.input else 0)


while cv.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.thr else None)


  for pair in POSE_PAIRS:
    partFrom = pair[0]
    partTo = pair[1]
    assert(partFrom in BODY_PARTS)
    assert(partTo in BODY_PARTS)


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


    if points[idFrom] and points[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('OpenPose using OpenCV', frame)

这里便是主函数的代码。

3.效果展示

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

三、效果优化

这个帧率虽然可以,但是效果属实有点拉跨。教我K210的学长便指导我进行优化改进,这里附上学长的连接

1.具体代码


import cv2
import time
import mediapipe as mp
from tqdm import tqdm


# 导入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)




def process_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)


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


  return img


cap = cv2.VideoCapture(1)


# 打开cap
cap.open(0)


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


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


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


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




cap.release()




cv2.destroyAllWindows()

2.效果展示

效果简直太好了

总结

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

怕什么真理无穷,进一寸有进一寸的欢喜。

审核编辑:汤梓红

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

    关注

    2526

    文章

    48093

    浏览量

    740061
  • 3D
    3D
    +关注

    关注

    9

    文章

    2756

    浏览量

    106454
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66767
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40775
  • CGI
    CGI
    +关注

    关注

    0

    文章

    20

    浏览量

    10310

原文标题:【人体姿态检测】通过Opencv+Openpose实现

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

收藏 人收藏

    评论

    相关推荐

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

    使用到,这里给大家举几个例子: 1、虚拟主播:大家看到B站直播时的“皮套人”,通常通过一个2D live的形象展示一个动漫形象,然后和主播同步动作。这就是通过摄像头识别当前主播姿态,再同步到虚拟形象上
    发表于 01-01 01:04

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

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

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

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

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

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

    如何使用Python中的OpenCV模块检测颜色

    在这篇文章中,我们将看到如何使用 Python 中的 OpenCV 模块检测颜色,进入这个领域的第一步就是安装下面提到的模块。pip install opencv-pythonpip install
    发表于 02-09 16:31

    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>

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

    通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库openCV进行人脸检测系统的设计,实现了对出现在视频或图像中的人脸
    发表于 06-15 10:53 477次下载
    基于<b class='flag-5'>openCV</b>的人脸<b class='flag-5'>检测</b>识别系统的设计

    ST姿态检测融合算法技术介绍

      姿态融合算法就是融合多种运动传感器数据(一般需要3轴加速度,3轴陀螺仪或者3轴地磁感应传感器),通过数字滤波算法容错补偿,实现当前姿态检测
    发表于 09-18 18:33 11次下载
    ST<b class='flag-5'>姿态</b><b class='flag-5'>检测</b>融合算法技术介绍

    基于OpenCV的微钻刃面检测

    为了解决微钻生产过程中人工抽检重复性差、精度低的问题,提出了微钻刃面的图像检测方法,建立了实验平台。通过程序控制光源亮度,从而获得一致的照明。图像处理程序使用了开源的OpenCV库,采用霍夫变换提取
    发表于 11-13 11:15 17次下载
    基于<b class='flag-5'>OpenCV</b>的微钻刃面<b class='flag-5'>检测</b>

    在Vivado中如何实现OpenCV设计

    观看视频,了解OpenCV库和其在一些典型应用中的使用,以及Zynq-7000 SoC的优点和如何实现OpenCV设计。同时您还能学习到如何在设计流程中使用HLS和视频库文件。本教程将 通过
    的头像 发表于 11-20 06:46 3663次阅读

    使用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>的研究分析

    使用Python和OpenCV实现行人检测的资料合集免费下载

    本文档的主要内容详细介绍的是使用Python和OpenCV实现行人检测的资料合集免费下载。
    发表于 06-01 17:42 23次下载
    使用Python和<b class='flag-5'>OpenCV</b><b class='flag-5'>实现</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>

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

    利用opencv+openpose实现人体姿态检测,附详细代码。 通过一个偶然机会,我了解到了人体姿态
    的头像 发表于 06-26 10:15 2294次阅读
    利用<b class='flag-5'>opencv+openpose</b><b class='flag-5'>实现</b>人体<b class='flag-5'>姿态</b><b class='flag-5'>检测</b>