范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

人体骨架舞OpenPose用pythonopencv实现

  1 说明
  =====
  1.1 本次基于OpenPose用python-opencv高级实现人体骨架舞,再次细化并写这篇文章,是为了回答我的一位粉丝的疑问。
  1.2 基于我的第一篇文章:《OpenPose:实现抖音很火的人体骨架和视频动态舞》。
  1.3 对视频单人舞蹈的人体骨架舞的代码进行删除、优化、修改、注释,提高可读性和可操作性。
  1.4 熟悉python和opencv的编程思维和熟悉cv2的函数。
  1.5 环境:python3.8+opencv4.4.0+深度deepin-linux操作系统+微软编辑器vscode。
  2 原图+骨架舞
  ===========
  2.1 效果图
  视频节选
  2.2 我的第一篇文章中有代码,对源代码进行修改后的代码#第1步:导入模块 import cv2 import time import numpy as np  #第2步:模块加载 #模块下载之间有介绍,此处省略 protoFile = "/home/xgj/Desktop/learnopencv/3-OpenPose-OK/pose/coco/pose_deploy_linevec.prototxt" weightsFile = "/home/xgj/Desktop/learnopencv/3-OpenPose-OK/pose/coco/pose_iter_440000.caffemodel"  #参数初始化设置,建议不要动参数,默认 #18个节点 nPoints = 18 #节点关系,固定 POSE_PAIRS = [ [1,0],[1,2],[1,5],[2,3],[3,4],[5,6],[6,7],[1,8],[8,9],[9,10],[1,11],[11,12],[12,13],[0,14],[0,15],[14,16],[15,17]] inWidth = 368 inHeight = 368 threshold = 0.1  #模型加载 net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)  #启动CPU,非GPU net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU) print("Using CPU device")  #第3步:cv2读取本地单人舞蹈视频 #cap = cv2.VideoCapture(0)  #读取摄像头实时检测人体骨架,有点卡,省略 #读取视频文件,注意单个人的姿势和人体骨架,目前多人出现bug cap = cv2.VideoCapture("/home/xgj/Desktop/learnopencv/3-OpenPose-OK/sample_video.mp4") hasFrame, frame = cap.read()  #生成本目录下的视频 vid_writer = cv2.VideoWriter("/home/xgj/Desktop/learnopencv/3-OpenPose-OK/output2.avi",cv2.VideoWriter_fourcc("M","J","P","G"), 10, (frame.shape[1],frame.shape[0]))  #第4步:循环 while cv2.waitKey(1) < 0:     #初始化时间     t = time.time()     hasFrame, frame = cap.read()     frameCopy = np.copy(frame)     #退出设置     if not hasFrame:         cv2.waitKey()         break          frameWidth = frame.shape[1]     frameHeight = frame.shape[0]      inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),                               (0, 0, 0), swapRB=False, crop=False)     net.setInput(inpBlob)     output = net.forward()      H = output.shape[2]     W = output.shape[3]     # Empty list to store the detected keypoints     points = []      for i in range(nPoints):         # confidence map of corresponding body"s part.         probMap = output[0, i, :, :]          # Find global maxima of the probMap.         minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)                  # Scale the point to fit on the original image         x = (frameWidth * point[0]) / W         y = (frameHeight * point[1]) / H          if prob > threshold :              cv2.circle(frameCopy, (int(x), int(y)), 8, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)             cv2.putText(frameCopy, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, lineType=cv2.LINE_AA)              # Add the point to the list if the probability is greater than the threshold             points.append((int(x), int(y)))         else :             points.append(None)      # Draw Skeleton     for pair in POSE_PAIRS:         partA = pair[0]         partB = pair[1]          if points[partA] and points[partB]:             #画骨架线和圆点,颜色可自定义             cv2.line(frame, points[partA], points[partB], (0, 255, 255), 3, lineType=cv2.LINE_AA)             cv2.circle(frame, points[partA], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)             cv2.circle(frame, points[partB], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)     #显示时间和帧     cv2.putText(frame, "time taken = {:.2f} sec".format(time.time() - t), (50, 50), cv2.FONT_HERSHEY_COMPLEX, .8, (255, 50, 0), 2, lineType=cv2.LINE_AA)     #动态显示     cv2.imshow("Output-Skeleton", frame)     #写入视频     vid_writer.write(frame)  vid_writer.release()
  3 纯骨架舞
  ========
  3.1 效果图:
  3.2 操作步骤简单,注意路径即可,采用cpu法,大概这个视频需要30分钟。
  3.3 代码#第1步:导入模块 import cv2 import time import numpy as np  #第2步:模块加载 #模块下载之间有介绍,此处省略 protoFile = "/home/xgj/Desktop/learnopencv/3-OpenPose-OK/pose/coco/pose_deploy_linevec.prototxt" weightsFile = "/home/xgj/Desktop/learnopencv/3-OpenPose-OK/pose/coco/pose_iter_440000.caffemodel"  #参数初始化设置,建议不要动参数,默认 #18个节点 nPoints = 18 #节点关系,固定 POSE_PAIRS = [ [1,0],[1,2],[1,5],[2,3],[3,4],[5,6],[6,7],[1,8],[8,9],[9,10],[1,11],[11,12],[12,13],[0,14],[0,15],[14,16],[15,17]] inWidth = 368 inHeight = 368 threshold = 0.1  #模型加载 net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)  #启动CPU,非GPU net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU) print("Using CPU device")  #第3步:cv2读取本地单人舞蹈视频 #cap = cv2.VideoCapture(0)  #读取摄像头实时检测人体骨架,有点卡,省略 #读取视频文件,注意单个人的姿势和人体骨架,目前多人出现bug cap = cv2.VideoCapture("/home/xgj/Desktop/learnopencv/3-OpenPose-OK/sample_video.mp4") hasFrame, frame = cap.read()  #生成本目录下的视频 vid_writer = cv2.VideoWriter("/home/xgj/Desktop/learnopencv/3-OpenPose-OK/output3.avi",cv2.VideoWriter_fourcc("M","J","P","G"), 10, (frame.shape[1],frame.shape[0]))  #第4步:循环 while cv2.waitKey(1) < 0:     #初始化时间     t = time.time()     hasFrame, frame = cap.read()     frameCopy = np.copy(frame)     #-------以上未修改-------      #增加一张输出的黑色图片,用于显示骨架和数字     out = np.zeros(frame.shape,np.uint8)  #修改处,此处增加          #-------以下未修改-------     #退出设置     if not hasFrame:         cv2.waitKey()         break      frameWidth = frame.shape[1]     frameHeight = frame.shape[0]     inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),                               (0, 0, 0), swapRB=False, crop=False)     net.setInput(inpBlob)     output = net.forward()     H = output.shape[2]     W = output.shape[3]     # Empty list to store the detected keypoints     points = []     for i in range(nPoints):         # confidence map of corresponding body"s part.         probMap = output[0, i, :, :]         # Find global maxima of the probMap.         minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)         # Scale the point to fit on the original image         x = (frameWidth * point[0]) / W         y = (frameHeight * point[1]) / H          if prob > threshold :           #---------以上未修改-------              #修改处:将frame改为out             cv2.circle(out, (int(x), int(y)), 8, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)             cv2.putText(out, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, lineType=cv2.LINE_AA)          #-------以下未修改-------             # Add the point to the list if the probability is greater than the threshold             points.append((int(x), int(y)))         else :             points.append(None)      # Draw Skeleton     for pair in POSE_PAIRS:         partA = pair[0]         partB = pair[1]          if points[partA] and points[partB]:     #-------以上未修改-------              #修改处:将frame改为out             cv2.line(out, points[partA], points[partB], (0, 255, 255), 3, lineType=cv2.LINE_AA)             cv2.circle(out, points[partA], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)             cv2.circle(out, points[partB], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)          #修改处:将frame改为out     cv2.putText(out, "time taken = {:.2f} sec".format(time.time() - t), (50, 50), cv2.FONT_HERSHEY_COMPLEX, .8, (255, 50, 0), 2, lineType=cv2.LINE_AA)     cv2.imshow("Output-Skeleton", out)     vid_writer.write(out)  vid_writer.release()
  4 小结
  4.1 讲解非常仔细,操作非常简单,是在源代码进行修改,非终端输入法,直接点击微软编辑器运行按钮即可。
  4.2 采用摄像头获取实时个人视频,可能有点卡,但是生成视频文件播放应该是正常的,可以试试。我没有试过。
  希望大家喜欢。

世界读书日丨生活有解,书给你答案(50本好书送您)微信中畅所欲言的语音条朋友圈里匆匆滑过的表情包抖音快手中令人捧腹的小视频已成为我们喜欢的表达方式文字书籍被一条条热闹的电子信息所取代匆匆忙忙的我们背负着各种责任压力身处信息海潮我们准大学生们,高考后请这样度过人生最幸福的暑假就在昨天下午全国大部分省份的高考落下帷幕首先恭喜各位考生穿过了人生第一个艰难隧道爬上了一个小土坡从此以后再碰到什么大考小考天空就会飘来六个字儿那都不是事儿这个长达两个多月的暑假据说为什么越乖的孩子,长大后心理问题越多?在孩子的成长过程中老师家长们会有意无意用乖来衡量一个孩子的好坏在学校孩子听话吗?是家长最关心的问题之一今天,小师为您推荐一篇文章这位作者从亲身经历表达了乖作为判断孩子好坏标准其中的太凡尔赛了!他们这学期最满意的一节课,原来这样上目前中小学各年级均已进入期末复习阶段即将迎来暑假回顾整整一个学期的教育教学生活在课堂教学层面您是否有了新的长进?还记得自己本学期最满意的一节课吗?这节课为什么成功?有哪些特点和促成教师集体表白现场!这个端午,我只想送你一首情诗又是一年端阳至绿杨带雨垂垂重五色新丝缠角粽吃粽子饮雄黄插艾草戴香囊划龙舟荡秋千在丰富多彩的活动中品读传统文化过好传统佳节红船破浪,百年风华万众齐颂大时代诗海泛舟,逸兴遄飞同心共筑新被人夸赞掌声一片的课就是好课吗?他说,未必究竟什么样的课才算是好课?设计新颖气氛热烈?被人夸赞掌声一片?2021河南教师成长学院中学语文班导师肖培东从父亲翻土种菜的故事中悟出了师者究竟该如何上课育人的朴素道理肖培东2021还不知道听课评课的意义何在?殊不知你错过了一大笔财富听课评课是学校基本且重要的教研活动之一开展有效的听课评课活动是提升教师教研水平促进教师专业发展的重要途径正所谓教无定法,贵在得法教师在听课评课时应该注意些啥?遵循啥原则?小师邀请了2021高考作文题汇总,来啦今天,2021年高考首日此刻2021全国高考作文题出炉成为最热门的话题那么,今年的高考作文会有哪些不一样?你敢来试试水吗?赶快一起来看看2021年普通高考语文作文试题全国甲卷中国共越是好老师越不像老师!不信,你看到底什么样的老师是好老师?好老师上的课是什么样子的?特级教师于永正从个人经历和观察中竟然得出做一名好老师的秘诀是做不太像老师的老师上不太像课的课!这究竟是为什么?于永正老师以自己真更大的舞台正在搭建,优秀的你想成为主角吗乡村教师发展是乡村教育发展乡村振兴的基础2019年3月,教育部启动实施中西部乡村中小学首席教师岗位计划这是一项为计深远的全国性事业覆盖面广意义重大目前安徽河南陕西甘肃四省已进入先行呀!单元整合教学,他来真的使用统编教材后以前以单篇文章为单位进行备课的方式还管用吗?有没有更好的备课方式?如何更精准地制订教学目标更科学高效地设计教学环节?面对这些问题如果您还是心存疑惑那今天这篇文章您一定
哪几类食物是不能空腹吃的?你需要知道如今大家特别关注养生问题,所以吃什么东西什么时候吃,对某些人来说是非常重要的问题。在大家的日常饮食中,很多人都有这样的习惯,比如,某些食物不能空腹进食,于是很多人听了这些传言,就会大腿根太粗,走路磨裆怎么办?学会这几个动作,有效改善腿型随着时代不断发展,人们对颜值身材等方面的重视程度越来越高,发胖也逐渐成为人们的烦恼。今天我们就来说说,让人最讨厌最尴尬的问题大腿根粗。大腿根粗最直接影响到的就是我们的行动,由于大腿桃养人杏伤人李子树下埋死人,这种说法科学吗?又是一年硕果丰收的季节,琳琅满目的水果散发成熟的味道,吸引着我们的味蕾。美味的桃子汁甜肉面的黄杏和酸甜可口的李子逐渐成熟,在我们悠闲品尝的时候,不禁又会想起老人们常说的那句话,桃养一个成人在什么样的人面前会表现的像个孩子?当我们幼年时,会觉得大人会保持长辈的威严正襟危坐那种,和我们孩子生活在一个不同的世界,孩子也进入不了童年的时代,后来渐渐发现成年人甚至是老年人会在和自己同龄的人面前表现的像个孩子一当与孩子产生矛盾的时候,需要耐心的去引导和沟通最近一周孩子幼儿园放假住在了外婆家,这一周工作比较忙,去外婆家看他时都很晚了。每次一去时,孩子就很兴奋的和我玩耍,因为白天工作比较疲惫,对于孩子跟我的玩耍互动,我身体很难承受。但我每天早上喝一碗开水冲鸡蛋,身体会收获2大好处喜欢吃鸡蛋的人也特别多,鸡蛋的烹饪方法也是各式各样。有种鸡蛋的吃法是采用沸腾的水将鸡蛋冲熟,这样做可以让鸡蛋在碗内形成蛋花,很多人说这样冲鸡蛋是鸡蛋最好的吃法。很多人对这种吃鸡蛋的猪皮是抗衰神器?不要想当然,医生效果不大,更易变胖衰老,是每个人都无法避免生理过程,虽然我们无法逃脱它的毒手,但可以延缓我们被抓捕的过程。猪皮是公认的抗衰小能手,能够让我们的肌肤保持健康的状态,抵抗衰老的侵袭,真的是如此吗?猪皮可男人如何保养才能延缓衰老?这3个方法要早点知道在这个社会上,人人为了生存,奔波于人山人海之中。社会竞争力像一座大山一样压在我们的肩膀上。特别是男性们,身为家中的顶梁柱,扛起上有老下有小的生活,徘徊于是是非非里。有研究说男性的生家长不恰当的教育方式,会给孩子带来消极的情绪周末带孩子参加亲子运动会,我因为有事去的晚,孩子爸爸先带他玩了一会儿,我到了之后看到孩子和爸爸正在参与足球游戏。老师循序渐进的带领孩子踢球,传球,然后才开始足球比赛式的游戏。孩子爸有时家长不管才是更好的管教晚饭时间外婆做好了饭菜,而孩子正在玩具,外婆叫了几次孩子吃饭了,他都没有反应。我走过去让孩子看着我,然后问他,现在到了吃饭时间,吃完饭以后再玩儿。孩子有点不情愿的来到饭桌上看了眼饭泡茶是一门学问,水温对茶汤影响很大,温度合适才能泡出好茶相信生活中不少人都有喝茶的习惯,但大多数人喝茶只是走个形式,当喝水那么喝,并不会深究茶叶的口感味道等,更不会去琢磨该用什么方式冲泡。为什么茶叶的种类有那么多,不仅是因为品种不同,还