赞
踩
人体姿态识别是计算机视觉领域的一个重要应用,它通过识别人体的关键点和关节位置,能够准确地判断人体的姿态和动作。这项技术可以应用在很多领域,比如运动训练、医疗康复、安保监控等,为人们的生活和工作带来了很大的便利和效益。
在本文中,我们将介绍一种基于 Python 和深度学习技术实现的人体姿态识别方法,通过读取图片或者摄像头捕获的视频流,使用 OpenCV 和 Tensorflow 模型来检测图像中的人体姿态,最终输出一幅图像,标注出身体各个关键点和关节的位置,以及关节之间的连线。
在开始实现人体姿态识别之前,我们需要先准备一些必要的工具和材料。首先,需要安装好 Python 环境和相关的库,比如 OpenCV、Tensorflow、Numpy 等。其次,需要下载预训练的 Tensorflow 模型,用于检测图像中的人体姿态。最后,需要一张图片或者摄像头捕获的视频流,作为输入数据。
在加载模型之前,我们需要先定义一些常量和参数,比如身体部位的编号、关节连线等。具体代码如下:
import cv2 import numpy as np # 定义身体部位编号 body_parts = { 0: "Nose", 1: "Neck", 2: "Right Shoulder", 3: "Right Elbow", 4: "Right Wrist", 5: "Left Shoulder", 6: "Left Elbow", 7: "Left Wrist", 8: "Right Hip", 9: "Right Knee", 10: "Right Ankle", 11: "Left Hip", 12: "Left Knee", 13: "Left Ankle", 14: "Right Eye", 15: "Left Eye", 16: "Right Ear", 17: "Left Ear" } # 定义关节连线 pose_parts = [ [0, 1], [1, 2], [2, 3], [3, 4], [1, 5], [5, 6], [6, 7], [1, 8], [8, 9], [9, 10], [1, 11], [11, 12], [12, 13], [0, 14], [14, 16], [0, 15], [15, 17] ] # 加载预训练的 Tensorflow 模型 net = cv2.dnn.readNetFromTensorflow("graph_opt.pb")
接下来,我们需要读取图片或者摄像头捕获的视频流,作为输入数据。具体代码如下:
# 读取图片或者视频流
image = cv2.imread("test.jpg")
# cap = cv2.VideoCapture(0)
如果要读取视频流,可以将注释取消掉,并将参数设置为对应的摄像头编号。
在将图像数据输入到模型之前,我们需要先对图像进行一些处理,将其转换成神经网络需要的输入格式。具体代码如下:
python
# 处理图像数据
blob = cv2.dnn.blobFromImage(image, 1.0, (368, 368), (0, 0, 0), swapRB=False, crop=False)
net.setInput(blob)
output = net.forward()
其中,cv2.dnn.blobFromImage 函数用于将图像转换成神经网络需要的输入格式,即将图像缩放到指定的大小,减去均值,进行归一化等操作。net.setInput 函数用于设置神经网络的输入数据。net.forward 函数用于前向传播计算,得到关键点的坐标。
在得到关键点的坐标之后,我们需要将其绘制出来,以便观察和分析。具体代码如下:
# 绘制关键点和关节连线
points = []
for i in range(len(body_parts)):
# 获取可信度
prob = output[0, i, 2]
# 判断可信度是否达到阈值
if prob > 0.5:
# 获取关键点坐标
x = int
import cv2 # 关节标识 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 } #关节连线 pose_parts=[ ["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"] ] cap=cv2.VideoCapture("a2.jpg") # cap=cv2.VideoCapture(0,cv2.CAP_DSHOW) # 加载模型 net=cv2.dnn.readNetFromTensorflow("pose.pb") while cv2.waitKey(1)<0: ok,frame=cap.read() if not ok: cv2.waitKey() break width=frame.shape[1] height=frame.shape[0] net.setInput(cv2.dnn.blobFromImage( frame,1.0,(368,368),(127,127,127),swapRB=True,crop=False )) out=net.forward() out=out[:,:19,:,:] # print(out) points=[] for i in range(len(body_parts)): heatmap=out[0,i,:,:] _,conf,_,point=cv2.minMaxLoc(heatmap) x=(width*point[0])/out.shape[3] y=(height*point[1])/out.shape[2] points.append((int(x),int(y))if conf>0.2 else None) # print(points) for p in pose_parts: partfrom = p[0] partto=p[1] idfrom=body_parts[partfrom] idto=body_parts[partto] if points[idfrom] and points[idto]: # 画线 cv2.line(frame,points[idfrom],points[idto],(0,200,0),3) # 画点 cv2.ellipse(frame,points[idfrom],(3,3),0,0,360,(0,0,200),cv2.FILLED) cv2.ellipse(frame, points[idto], (3, 3), 0, 0, 360, (0, 0, 200), cv2.FILLED) cv2.imshow("",frame)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。