人体骨架舞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月,教育部启动实施中西部乡村中小学首席教师岗位计划这是一项为计深远的全国性事业覆盖面广意义重大目前安徽河南陕西甘肃四省已进入先行
呀!单元整合教学,他来真的使用统编教材后以前以单篇文章为单位进行备课的方式还管用吗?有没有更好的备课方式?如何更精准地制订教学目标更科学高效地设计教学环节?面对这些问题如果您还是心存疑惑那今天这篇文章您一定