通过一个偶然机会,我了解到了人体姿态解算,在学习k210之余,我便想着通过opencv实现这个功能,查找了很多资料,发现可以利用opencv+openpose实现,接着我又开始找一些资料,在pycharm上部署。
前言
人体姿态估计的一个有趣应用是 cgi(computer graphic image,一种电影制造技术)应用。如果可以检测出人体姿态,那么图形、风格、特效增强、设备和艺术造型等就可以被加载在人体上。
通过追踪人体姿态的变化,渲染的图形可以在人动的时候“自然”地与人“融合”。姿态估计的一个有趣应用是在交互游戏中追踪人体对象的运动。
比较流行的 kinect 使用 3d 姿态估计(采用 ir 传感器数据)来追踪人类玩家的运动,从而利用它来渲染虚拟人物的动作。
应用:
用于检测一个人是否摔倒或疾病
用于健身、体育和舞蹈等的自动教学
用于理解全身的肢体语言(如机场跑道信号、交警信号等)
用于增强安保和监控
一、环境配置
pycharm2021.2.2
pycharm是一个很好用的软件,刚开始我们必须要配置相应的环境,当然你使用我主页里那篇模型训练的环境也可以,在你运行的时候系统会提示你缺少了什么环境,并让你安装,你直接安装即可。这里我就不过多的赘述了。
1.导入文件
在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_pathimport cv2 as cvimport numpy as npimport argparseparser = 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.widthinheight = args.heightnet = cv.dnn.readnetfromtensorflow(graph_opt.pb)cap = cv.videocapture(args.input if args.input else 0)while cv.waitkey(1) 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 cv2import timeimport mediapipe as mpfrom tqdm import tqdm# 导入solutionmp_pose = mp.solutions.posemp_drawing = mp.solutions.drawing_utilspose = 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 imgcap = cv2.videocapture(1)# 打开capcap.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]: breakcap.release()cv2.destroyallwindows()
2.效果展示
效果简直太好了
总结
到这里这篇文章就结束了,写这篇博客只是单纯记录自己的学习过程。希望看到这篇博客的你,能够更加坚定的学习。胡适说过一句话我觉得特别好,这里分享给大家。
怕什么真理无穷,进一寸有进一寸的欢喜。
RS485无线通讯模块的工作原理及应用场景
森海塞尔推出新款无线耳机,续航可达30小时
华为云IoT开发能力套件助力行业实现数字化转型
光催化空气净化器的工作原理及应用
美国研发全世界亮度最高的纳米粒子
通过Opencv+Openpose实现体姿态检测
2020年微信已处理超620万个违规账号
百度推出多种AI防疫工具;联发科2月营收同比增长28.67%…
科技杂谈:那些iPhone7发布会没告诉你的信息
三点带你了解 生活智能人体感应开关设计
联想常程:智能手机正在消亡
什么是IPX
二端口网络的等效电路
氙灯试验箱光稳定性和耐候性加速测试解决方案
动环监控系统功能
楼宇供配电监控系统方案
拜登即将就职 外媒:须重新评估中国 5G 数据安全
Mentor如何应对汽车数字化发展的安全性可靠性
图像处理的相关算法介绍
采用三轴加速度传感器的电梯地震传感器