OpenPose实现人体姿态估计(人体关键点检测)

该博客详细介绍了如何结合Python、OpenCV和OpenPose库来实现人体关键点检测,即人体姿态估计。通过这个教程,读者可以学习到如何设置环境,理解OpenPose的工作原理,并实现实时的人体姿态识别应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### 使用 OpenCV 实现类似 OpenPose人体姿态估计并获取关键点 ID 为了使用 OpenCV 实现类似 OpenPose人体姿态估计,可以按照以下方法操作: #### 准备工作 确保安装了必要的库和依赖项。可以通过 pip 安装 opencv-python 和其他所需的 Python 库。 ```bash pip install opencv-python numpy ``` #### 加载预训练模型 加载由 OpenPose 提供的预训练模型权重文件,并设置网络参数。这一步骤对于后续的关键点检测至关重要[^1]。 ```python import cv2 import numpy as np protoFile = "path/to/pose_deploy_linevec.prototxt" weightsFile = "path/to/pose_iter_440000.caffemodel" net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile) frameWidth = 640 frameHeight = 480 inWidth = 368 inHeight = 368 thr = 0.1 ``` #### 图像预处理 读入待分析的图像或视频帧,并调整其大小以适应输入到神经网络的要求。 ```python def preprocess_frame(frame): inpBlob = cv2.dnn.blobFromImage( frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False ) net.setInput(inpBlob) output = net.forward() return output ``` #### 解析输出数据 解析来自 CNN 输出的数据来提取各个关节的位置信息以及它们之间的连接关系。这里会涉及到 PAFs(Part Affinity Fields),即部件亲缘场,用来关联不同部分之间可能存在的联系[^3]。 ```python nPoints = 18 # POSE_PAIRS 中定义的数量加一 keypointsMapping = ['Nose', 'Neck', ... , 'R_Eye'] # 这里省略了一些中间元素 POSE_PAIRS = [[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]] detected_keypoints = [] for i in range(nPoints): probMap = output[0, i, :, :] minVal, prob, minLoc, point = cv2.minMaxLoc(probMap) if prob > thr : detected_keypoints.append((int(point[0]), int(point[1]))) else : detected_keypoints.append(None) ``` 上述代码片段展示了如何通过遍历 `output` 数组中的每一个通道(对应于不同的身体部位)来进行阈值判断,从而决定哪些位置被认为是有效的人体关键点[^4]。 #### 绘制结果 最后,在原始图像上绘制出识别出来的骨架结构及其对应的编号标签。 ```python for pair in POSE_PAIRS: partA = keypointsMapping[pair[0]] partB = keypointsMapping[pair[1]] if None not in (detected_keypoints[pair[0]], detected_keypoints[pair[1]]): A = tuple(detected_keypoints[pair[0]]) B = tuple(detected_keypoints[pair[1]]) cv2.line(frame, A, B, (0, 255, 255), 2) text_position = ((A[0]+B[0])//2, (A[1]+B[1])//2) cv2.putText(frame, f"{pair}", text_position, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255)) cv2.imshow('Output-Keypoints', frame) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段本会在每一对相连的身体部位间画线,并标注这对连线所代表的具体部位对索引号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值