应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

再发超火抖音单人多人尬舞pythoncv2实现完整版

  1说明
  1。1再发:是因为之前发过单人图和视频的骨架检测,多人报错。
  《OpenPose:实现抖音很火的人体骨架和视频动态舞》
  《人体骨架舞:OpenPose用pythonopencv实现》
  1。2本次代码是完整的全套均可,本次代码讲解清楚,逐步分析,注释清楚,适合收藏。
  即:
  单人图片和单人视频检测,单人摄像头检测
  多人图片和多人视频检测,多人摄像头检测
  1。3python的编程思维和编程要点复习,opencv相关知识。
  2图片
  2。1原图:来自今日头条免费正版图库
  2。2效果图
  3视频
  3。1视频来源:something视频节选yougethttps:y。qq。comnyqqmvvs0023dwf6xi。html
  3。2多人视频操作效果图
  4代码讲解
  4。1第1步:代码头部注释代码名:personopenposeall。py本代码说明,是在源代码的基础上进行修改原代码来自:https:github。comspmallicklearnopencv下的OpenPoseMultiPerson代码可执行图片和视频的人体骨架测试单人和多人骨架均可以视频来自摄像头和mp4均可以
  4。2第2步:模块导入importcv2importnumpyasnpimportos路径管理
  4。3附注环境:python3。8opencv4。4。0linux系统微软编辑器vscode,个人喜欢点击运行按钮。第3步:路径管理curpathos。path。realpath(file)获取当前代码的绝对路径dirpathos。path。dirname(curpath)获取当前文件的文件夹路径
  4。4模型加载和参数设置第4步:模型加载protoFiledirpathposecocoposedeploylinevec。prototxt需要自己提前下载,第一篇文章已经告诉如何下载weightsFiledirpathposecocoposeiter440000。caffemodel参数设置nPoints18COCOOutputFormat,名称列表,可注释掉keypointsMapping〔Nose,Neck,RSho,RElb,RWr,LSho,LElb,LWr,RHip,RKnee,RAnk,LHip,LKnee,LAnk,REye,LEye,REar,LEar〕POSEPAIRS〔〔1,2〕,〔1,5〕,〔2,3〕,〔3,4〕,〔5,6〕,〔6,7〕,〔1,8〕,〔8,9〕,〔9,10〕,〔1,11〕,〔11,12〕,〔12,13〕,〔1,0〕,〔0,14〕,〔14,16〕,〔0,15〕,〔15,17〕,〔2,17〕,〔5,16〕〕mapIdx〔〔31,32〕,〔39,40〕,〔33,34〕,〔35,36〕,〔41,42〕,〔43,44〕,〔19,20〕,〔21,22〕,〔23,24〕,〔25,26〕,〔27,28〕,〔29,30〕,〔47,48〕,〔49,50〕,〔53,54〕,〔51,52〕,〔55,56〕,〔37,38〕,〔45,46〕〕颜色列表colors〔〔0,100,255〕,〔0,100,255〕,〔0,255,255〕,〔0,100,255〕,〔0,255,255〕,〔0,100,255〕,〔0,255,0〕,〔255,200,100〕,〔255,0,255〕,〔0,255,0〕,〔255,200,100〕,〔255,0,255〕,〔0,0,255〕,〔255,0,0〕,〔200,200,0〕,〔255,0,0〕,〔200,200,0〕,〔0,0,0〕〕
  4。5这块是关键,搞透了就是大牛,一般不需要调整。第5步:函数定义获取关节点函数defgetKeypoints(probMap,threshold0。1):mapSmoothcv2。GaussianBlur(probMap,(3,3),0,0)mapMasknp。uint8(mapSmooththreshold)keypoints〔〕findtheblobscontours,cv2。findContours(mapMask,cv2。RETRTREE,cv2。CHAINAPPROXSIMPLE)foreachblobfindthemaximaforcntincontours:blobMasknp。zeros(mapMask。shape)blobMaskcv2。fillConvexPoly(blobMask,cnt,1)maskedProbMapmapSmoothblobMask,maxVal,,maxLoccv2。minMaxLoc(maskedProbMap)keypoints。append(maxLoc(probMap〔maxLoc〔1〕,maxLoc〔0〕〕,))returnkeypointsFindvalidconnectionsbetweenthedifferentjointsofaallpersonspresentdefgetValidPairs(output):validpairs〔〕invalidpairs〔〕ninterpsamples10pafscoreth0。1confth0。7loopforeveryPOSEPAIRforkinrange(len(mapIdx)):ABconstitutealimbpafAoutput〔0,mapIdx〔k〕〔0〕,:,:〕pafBoutput〔0,mapIdx〔k〕〔1〕,:,:〕pafAcv2。resize(pafA,(frameWidth,frameHeight))pafBcv2。resize(pafB,(frameWidth,frameHeight))FindthekeypointsforthefirstandsecondlimbcandAdetectedkeypoints〔POSEPAIRS〔k〕〔0〕〕candBdetectedkeypoints〔POSEPAIRS〔k〕〔1〕〕nAlen(candA)nBlen(candB)if(nA!0andnB!0):validpairnp。zeros((0,3))foriinrange(nA):maxj1maxScore1found0forjinrange(nB):Finddijdijnp。subtract(candB〔j〕〔:2〕,candA〔i〕〔:2〕)normnp。linalg。norm(dij)ifnorm:dijdijnormelse:continueFindp(u)interpcoordlist(zip(np。linspace(candA〔i〕〔0〕,candB〔j〕〔0〕,numninterpsamples),np。linspace(candA〔i〕〔1〕,candB〔j〕〔1〕,numninterpsamples)))FindL(p(u))pafinterp〔〕forkinrange(len(interpcoord)):pafinterp。append(〔pafA〔int(round(interpcoord〔k〕〔1〕)),int(round(interpcoord〔k〕〔0〕))〕,pafB〔int(round(interpcoord〔k〕〔1〕)),int(round(interpcoord〔k〕〔0〕))〕〕)FindEpafscoresnp。dot(pafinterp,dij)avgpafscoresum(pafscores)len(pafscores)CheckiftheconnectionisvalidIfthefractionofinterpolatedvectorsalignedwithPAFishigherthenthresholdValidPairif(len(np。where(pafscorespafscoreth)〔0〕)ninterpsamples)confth:ifavgpafscoremaxScore:maxjjmaxScoreavgpafscorefound1Appendtheconnectiontothelistiffound:validpairnp。append(validpair,〔〔candA〔i〕〔3〕,candB〔maxj〕〔3〕,maxScore〕〕,axis0)Appendthedetectedconnectionstothegloballistvalidpairs。append(validpair)else:Ifnokeypointsaredetectedprint(NoConnection:k{}。format(k))invalidpairs。append(k)validpairs。append(〔〕)returnvalidpairs,invalidpairs分配到人的关节点和关节线函数ThisfunctioncreatesalistofkeypointsbelongingtoeachpersonForeachdetectedvalidpair,itassignsthejoint(s)toapersondefgetPersonwiseKeypoints(validpairs,invalidpairs):thelastnumberineachrowistheoverallscorepersonwiseKeypoints1np。ones((0,19))forkinrange(len(mapIdx)):ifknotininvalidpairs:partAsvalidpairs〔k〕〔:,0〕partBsvalidpairs〔k〕〔:,1〕indexA,indexBnp。array(POSEPAIRS〔k〕)foriinrange(len(validpairs〔k〕)):found0personidx1forjinrange(len(personwiseKeypoints)):ifpersonwiseKeypoints〔j〕〔indexA〕partAs〔i〕:personidxjfound1breakiffound:personwiseKeypoints〔personidx〕〔indexB〕partBs〔i〕personwiseKeypoints〔personidx〕〔1〕keypointslist〔partBs〔i〕。astype(int),2〕validpairs〔k〕〔i〕〔2〕iffindnopartAinthesubset,createanewsubsetelifnotfoundandk17:row1np。ones(19)row〔indexA〕partAs〔i〕row〔indexB〕partBs〔i〕addthekeypointscoresforthetwokeypointsandthepafscorerow〔1〕sum(keypointslist〔validpairs〔k〕〔i,:2〕。astype(int),2〕)validpairs〔k〕〔i〕〔2〕personwiseKeypointsnp。vstack(〔personwiseKeypoints,row〕)returnpersonwiseKeypoints
  4。6第6步:导入类型图片类常规是image1或者image,为了与视频代码兼容这里采用frame代替原来的image1framecv2。imread(dirpath11。jpeg)视频类capcv2。VideoCapture(dirpaths。mp4)mp4视频,cpu生成有一点慢capcv2。VideoCapture(0)摄像头hasFrame,framecap。read()生成本目录下的视频vidwritercv2。VideoWriter(dirpathoutputs。avi,cv2。VideoWriterfourcc(M,J,P,G),10,(frame。shape〔1〕,frame。shape〔0〕))视频类
  4。7第7步:启动cpu训练和调动模型netcv2。dnn。readNetFromCaffe(protoFile,weightsFile)net。setPreferableBackend(cv2。dnn。DNNTARGETCPU)print(UsingCPUdevice)
  4。8第8步:循环内设置whilecv2。waitKey(1)0:增加一张输出的黑色图片,用于显示骨架和数字outnp。zeros(frame。shape,np。uint8)add视频类,图片不需要,可以注释掉hasFrame,framecap。read()frameCopynp。copy(frame)退出设置ifnothasFrame:cv2。waitKey()break视频类frameWidthframe。shape〔1〕frameHeightframe。shape〔0〕FixtheinputHeightandgetthewidthaccordingtotheAspectRatioinHeight368inWidthint((inHeightframeHeight)frameWidth)inpBlobcv2。dnn。blobFromImage(frame,1。0255,(inWidth,inHeight),(0,0,0),swapRBFalse,cropFalse)net。setInput(inpBlob)outputnet。forward()detectedkeypoints〔〕keypointslistnp。zeros((0,3))keypointid0threshold0。1forpartinrange(nPoints):probMapoutput〔0,part,:,:〕probMapcv2。resize(probMap,(frame。shape〔1〕,frame。shape〔0〕))keypointsgetKeypoints(probMap,threshold)keypointswithid〔〕foriinrange(len(keypoints)):keypointswithid。append(keypoints〔i〕(keypointid,))keypointslistnp。vstack(〔keypointslist,keypoints〔i〕〕)keypointid1detectedkeypoints。append(keypointswithid)frameCloneframe。copy()foriinrange(nPoints):forjinrange(len(detectedkeypoints〔i〕)):cv2。circle(frameClone,detectedkeypoints〔i〕〔j〕〔0:2〕,5,colors〔i〕,1,cv2。LINEAA)展示窗口1:关节点cv2。imshow(1Keypoints,frameClone)validpairs,invalidpairsgetValidPairs(output)personwiseKeypointsgetPersonwiseKeypoints(validpairs,invalidpairs)foriinrange(17):forninrange(len(personwiseKeypoints)):indexpersonwiseKeypoints〔n〕〔np。array(POSEPAIRS〔i〕)〕if1inindex:continueBnp。int32(keypointslist〔index。astype(int),0〕)Anp。int32(keypointslist〔index。astype(int),1〕)cv2。line(frameClone,(B〔0〕,A〔0〕),(B〔1〕,A〔1〕),colors〔i〕,3,cv2。LINEAA)cv2。line(out,(B〔0〕,A〔0〕),(B〔1〕,A〔1〕),colors〔i〕,3,cv2。LINEAA)add展示窗口2:骨架关节线cv2。imshow(2DetectedPose,frameClone)展示窗口3:纯骨架关节线cv2。imshow(3PureDetectedPose,out)add视频类,需要下面的代码,图片检测,可以注释掉vidwriter。write(frameClone)vidwriter。release()视频类
  结束,如果实时,可能需要GPU或者高性能计算机。
  基本完整!!

端午将至,分享一道多子多福,几分钟就上桌,祝大家幸福安康端午节即将来临,在这个重要的日子里,吃是摆在重中之重的事。它不仅仅是填饱肚子也是人们对亲人的一种关怀和期望,更是一种古老的文化传承。端午节每个地方的饮食都有所区别,像我的……孕妇羊水偏多怎么恢复正常?如何应对?虽然大多孕妈妈都听过羊水,也知道羊水,但是对于羊水的了解并不多。对于羊水过多怎么办,羊水过少怎么办这样的问题,也是不知道该怎么应对。一、羊水过多怎么办?常见羊水过多……日本人家政有多牛?打工人19的家垃圾堆到胸口,保洁师小场面和满屋子垃圾一起生活,是不是想都不敢想?而在如今的日本,还真有这么一群人,他们终日与房间内堆积如山的垃圾生活在一起别觉得不可思议,实际上现在这样的情况还真不少,今儿我就用……大一到大四对比照火了,堪比大型整容现场,男生比女生更惊艳有句俗话说岁月是把杀猪刀,但很多大学生用四年的时间向我们证明时间也是一把整容刀,而操青春的刀的人正是自己。许多出入大学的学生,脸上多多少少会带有几分高中生的青涩与稚嫩,等……每位大学新鲜人应人手一本如何在大学学习新晋大学生需要面临学习方法上的巨大转换由填鸭式的被动学习转换为积极自律的主动学习。重新定义学习,并有意识地调整学习方法,是取得学业成功的必经之路。本书每位大学新鲜人应人手……我的月嫂生涯(四)我做月嫂十几年了,啥样客户,都遇到过,有的咬咬牙,忍下来了,有的,实在触碰我的底线,就提前下户了,找借口,也遇到过被客户各种理由辞退过,假如,做家政服务的,说没遇到过难侍候客户……孩子不会仿说或只会仿说,该怎么训练?在我们过往的案例中常常听到半个月开口说话3岁第一次叫‘妈妈’的分享,从无语言到开口说话,这是一次质的进步。孩子的语言开关打开后,如下场景会开始频频出现:家长说:宝贝……有事没事,请不要喊妈!谢谢配合作者卡卡辛对于女人来说,这世界上最甜蜜又可怕的称呼是什么?没错,就是妈妈。自从当了妈,孩子每天100遍的妈妈简直响彻耳边。初时,这声音奶声奶气,算是可爱入耳。……就是要保鲜!盘点那些和冰箱搭配11ampampgt2的神器拜冰箱所赐,我们在一整年任何时候都能吃到新鲜安全健康的食物。也就是说,冰箱最大的作用就是为食物保鲜。而想要达到最好的保鲜效果,未经处理的食材也好,吃不完的剩菜也罢,简单粗……幼儿园勇敢之夜嗨翻天,硬核口号走红网络,父母那我走?文小雪妈妈小学初中都迎来了放假,该毕业的毕业,该升学的升学,大家都会搞个仪式,算是纪念下人生某个阶段的结束。但是仪式感并非小学以后才有,现在不少幼儿园,在毕业的时候也会搞……人只要有这种精神,没有什么不可以导引:江小草。去年,我在今日头条看到他的视频,被他的爱心所感动。他会热心介绍,想有出国意愿的家长,应该注意的事项,少走弯路。江小草出身可谓家境贫寒,没有什么资源。刚刚大学……在农村,光棍汉最担忧的问题是什么前言:很多人认为对于农村光棍汉来说,能否娶到媳妇是他们最担忧的问题,因为在农村流传着不孝有三,无后为大的说法,所以传宗接代是光棍汉人生最大的追求。这样的说法是否绝对准确呢……
千万别只关注孩子视力,而忽略听力保护大家好,我是小艾。一个专业的教育音频解决方案供应商,为客户创造舒适声环境是我们一直以来的目标。最近,有老师和我提起他的苦恼:随着教学任务逐渐加重,班级学生越来……想低调但实力不允许,央媒力挺的追觅V8吸尘器,不火都不行随着科技和工业的发展,带来的是人们生活的进步和便利,尤其是智能家居进入到家庭之后,与此同时也带来了空气质量的直线下降,家中的灰尘也与日俱增,但是工业发展的脚步不会停止,如何改善……关于情绪,你一定要了解这十件事1hr情绪不只是喜怒哀乐,能够觉察到的、无法觉察到的加起来成百上千种,甚至更多。。。。情绪是一种能量,而这看不到的能量,正是影响我们是否健康、家庭是否幸福、事业是否顺畅、……洗澡就哭,穿衣就闹,自闭症孩子抗拒学自理怎么办?教自闭症孩子学习基本的生活自理技能,委实难倒了一大票的家长。洗澡、刷牙、穿衣服、剪头发、剪指甲这些在我们看起来自然而然就能学会的技能,自闭症孩子却要学成百上千遍。可是尽管……最惨的豪车,曾60万供不应求,现23。48万销量堪忧日系车和德系车是中型领域里面的领头羊,它们的存在让其它竞争对手很难讨到好果子吃,汽车厂商不断的更新换代让雅阁,凯美瑞,迈腾一直保持着热度,但有些车型就是换了代也卖不动,这是为什……明明不是月经期,阴道却莫名其妙流血很多女孩都有过这样的经历:月经过后不久大姨妈又掉转回头找自己这样的非经期出血很多女性朋友为此惶恐不已女性非经期出血是什么原因呢?其实,非经期……育儿系列之六想要孩子成为什么样子,就表扬孩子是什么样子。我们在对小孩的教育过程当中,一定要多鼓励,多进行正面的评价,少批评,少进行负面的打击。在表扬的时候应当结合当时具体的事情进行,表扬的内容越具体越好。当然,不一定孩子做对了或者把……胎儿老是半夜踢肚子,原因大多出自宝妈,别再熬夜追剧了有的孕妈怀孕的时候总是说晚上睡不着觉,其实不是自己不想睡,而是胎儿在肚子里乱踢让自己根本就睡不着,所以有的孕妈索性也就不为难自已,趁机追个剧啥的。小季怀孕的时候前三个月是……2岁宝宝满口脏话讨人嫌怎么办,这么小就学是坏什么原因【导语】:前段时间,遇到一个家长问询,说孩子刚上幼儿园,说话不清楚,但是骂人的话说得贼溜,2岁时就学会说脏话了,一个字一个字的蹦,在幼儿园,经常说别的小朋友是臭鸡蛋,臭猪头啥的……中英直飞继续取消!英国确诊400例印度变种!夜店首次重开5月1日英国疫情和时事日更重点有:首都航空取消5月31日之前青岛伦敦往返航班英格兰R值微升至0。81。1,但感染病例一周内下降了40英国2200万人生活在4月份新冠零死亡……斜杠青年的无边界人生从一而终把一件事做到极致的人生当然值得点赞,但经历丰盛、没有边界的人生同样别具意义文耘田当很多人还在信奉铁饭碗、朝九晚五按部就班地打卡上班的时候,有些人却把本职之外……孩子上幼儿园如何选择,挑选技巧入园准备,这些你真的清楚吗?为了不让孩子输在起跑线上,许多父母在娃上幼儿园之前就开始筹划,选学校更是重中之重。如何给孩子选择幼儿园?幼儿园本来作为孩子适应集体的一个开始,现在却成了提升孩子学习……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网