Python Opencv实践 - 人体姿态检测

本文仍然使用mediapipe做练手项目,封装一个PoseDetector类用作基础姿态检测类。

mediapipe中人体姿态检测的结果和手部跟踪检测的结果是类似的,都是输出一些定位点,各个定位点的id和对应人体的位置如下图所示:

关于mediapipe的pose解决方案类更详细的说明,可自行百度或参考这里:

MediaPipe基础(5)Pose(姿势)_mediapipe pose-CSDN博客文章浏览阅读1.5w次,点赞9次,收藏110次。1.摘要从视频中估计人体姿势在各种应用中起着至关重要的作用,例如量化体育锻炼、手语识别和全身手势控制。例如,它可以构成瑜伽、舞蹈和健身应用的基础。它还可以在增强现实中将数字内容和信息叠加在物理世界之上。MediaPipe Pose 是一种用于高保真身体姿势跟踪的 ML 解决方案,利用我们的 BlazePose 研究从 RGB 视频帧推断整个身体上的 33 个 3D 地标和背景分割掩码,该研究也为 ML Kit 姿势检测 API 提供支持。当前最先进的方法主要依赖于强大的桌面环境进行推理,而我们的方法在大_mediapipe posehttps://blog.csdn.net/weixin_43229348/article/details/120541448 和前面的手部检测代码类似,封装一个PoseDetector类,代码如下:

复制代码
import cv2 as cv
import mediapipe as mp
import time

#mediapipe的pose用于检测人体姿态
#参考资料:https://blog.csdn.net/weixin_43229348/article/details/120541448
class PoseDetector():
    def __init__(self,
                 mode = False,
                 modelComplexity = 1,
                 upperBodyOnly = False,
                 smoothLandmarks = True,
                 minDetectionConfidence = 0.5,
                 minTrackConfidence = 0.5):
        self.mpPose = mp.solutions.pose
        self.pose = self.mpPose.Pose(mode, modelComplexity, upperBodyOnly, smoothLandmarks, minDetectionConfidence, minTrackConfidence)
        self.mpDraw = mp.solutions.drawing_utils

    def Detect(self, img, drawOnImage = True):
        #mediapipe需要RGB,opencv默认的格式为BGR,进行转换
        imgRGB = cv.cvtColor(img, cv.COLOR_BGR2RGB)
        self.results = self.pose.process(imgRGB)
        
        if (self.results.pose_landmarks):
            #print(results.pose_landmarks)
            if drawOnImage:
                self.mpDraw.draw_landmarks(img, self.results.pose_landmarks, self.mpPose.POSE_CONNECTIONS)
        return img

    def GetPosition(self, img, drawOnImage = True):
        landmarkList = []
        if self.results.pose_landmarks:
            for id, landmark in enumerate(self.results.pose_landmarks.landmark):
                h,w,c = img.shape
                x = int(landmark.x * w)
                y = int(landmark.y * h)
                landmarkList.append([id, x, y])
                if (drawOnImage):
                    #cv.circle(img, (x,y), 5, (0,255,0))
                    cv.putText(img, str(id), (x,y), cv.FONT_HERSHEY_PLAIN, 1, (0,255,0), 1)
        return landmarkList


def DisplayFPS(img, preTime):
    curTime = time.time()
    if (curTime - preTime == 0):
        return curTime;
    fps = 1 / (curTime - preTime)
    cv.putText(img, "FPS:" + str(int(fps)), (10,70), cv.FONT_HERSHEY_PLAIN,
              3, (0,255,0), 3)
    return curTime

def main():
    poseDetector = PoseDetector()
    video = cv.VideoCapture('../../SampleVideos/acts.mp4')
    #FPS显示
    preTime = 0
    
    while True:
        ret,frame = video.read()
        if ret == False:
            break;

        frame = poseDetector.Detect(frame)
        poseDetector.GetPosition(frame)
        preTime = DisplayFPS(frame, preTime)
        cv.imshow('Real Time Hand Detection', frame)
        if cv.waitKey(10) & 0xFF == ord('q'):
            break;
    video.release()
    cv.destroyAllWindows()

if __name__ == "__main__":
    main()

运行结果:

可以参考我的B站视频:

Python Opencv - Mediapipe人体姿态检测_哔哩哔哩_bilibili

相关推荐
拜小白2 小时前
【论文解读】PanoContext:全景场景理解的全房间 3D 上下文模型
计算机视觉·全景图
Keep_Trying_Go2 小时前
MobileSAMv2分割算法详解
图像处理·人工智能·计算机视觉
weixin_460443564 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
kobe_OKOK_7 小时前
__getattr__和__getattribute__如何用
python
richard_yuu8 小时前
OpenCV 实战第 9 篇:Template Matching vs 特征匹配,ROI 定位该选哪个
opencv
全栈弄潮儿8 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
长沙三为智能科技8 小时前
家政小程序门店运营模块设计:会员、下单、派单、结算四段链路的落地拆解
python·小程序·内容运营
Cc.Y8 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
lank_M8 小时前
截图OCR预处理在普通屏上翻车,Retina截图却没事
图像处理·人工智能·计算机视觉·ocr
启观川8 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法