【人体关键点定位】mediapipe_身体定位(二)

人体关键点图例

在这里插入图片描述
参考:https://google.github.io/mediapipe/solutions/pose.html

函数式

import cv2
import mediapipe as mp
import time
import os
import random

def video_ope(file):
    frame = 0
    switch = True
    cap = cv2.VideoCapture(file)
    mypose= mp.solutions.pose
    pose = mypose.Pose()
    myDraw = mp.solutions.drawing_utils

    DrawingSpec_point = myDraw.DrawingSpec((0, 255, 0), 2, 2)

    while(True):
        ret, img = cap.read()
        img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        results = pose.process(img_rgb)
        #print(results.pose_landmarks)
        if (results.pose_landmarks):
            for id,lm in enumerate(results.pose_landmarks.landmark):
            	#print (id,"\n",lm)
            	h,w,c  = img.shape
            	cx,cy = int(lm.x*w),int(lm.y*h)
            	print (id,cx,cy)
            	if id == 0  :
            	    cv2.circle(img,(cx,cy),12,(0,255,255),cv2.FILLED)
            	else:
            		cv2.circle(img,(cx,cy),7,(255,0,0),cv2.FILLED)
            
            myDraw.draw_landmarks(img,results.pose_landmarks,mypose.POSE_CONNECTIONS,DrawingSpec_point)

 
        frame +=1
        cv2.putText(img,str(int(frame)),(10,70),cv2.FONT_HERSHEY_PLAIN,3,(255,0,255),3)
        cv2.imshow("Frame", img)
        key = cv2.waitKey(1) & 0xFF

        if key== ord('q'):
            cv2.waitKey(0)
        if key== 27:
            break

    cap.release()
    cv2.destroyAllWindows()

def main():
    file = "video/anime.mp4"
    video_ope(file)

if __name__=="__main__":
    main()

模块式

import cv2
import mediapipe as mp
import time
import os
import random

class PoseDetector:
    def __init__(self, mode = False, upBody = False, smooth=True, detectionCon = 0.5, trackCon = 0.5):
        self.mode = mode
        self.upBody = upBody
        self.smooth = smooth
        self.detectionCon = detectionCon
        self.trackCon = trackCon
        self.mpDraw = mp.solutions.drawing_utils
        self.mpPose = mp.solutions.pose
        self.DrawingSpec_point = self.mpDraw.DrawingSpec((0, 255, 0), 2, 2)
        if mode:
            self.pose = self.mpPose.Pose(self.mode, self.upBody, self.smooth, self.detectionCon, self.trackCon)
        else:
            self.pose = self.mpPose.Pose()
    def findPose(self, img, draw=True):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        self.results = self.pose.process(imgRGB)
        #print(results.pose_landmarks)
        if self.results.pose_landmarks:
            if draw:
                self.mpDraw.draw_landmarks(img, self.results.pose_landmarks, self.mpPose.POSE_CONNECTIONS,self.DrawingSpec_point)
        return img
    def getPosition(self, img, draw=True):
        lmList= []
        if self.results.pose_landmarks:
            for id, lm in enumerate(self.results.pose_landmarks.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmList.append([id, cx, cy])
                if draw:
                    if id == 0  :
                        cv2.circle(img,(cx,cy),12,(255,255,20),cv2.FILLED)
                    else:
                        cv2.circle(img,(cx,cy),5,(255,0,0),cv2.FILLED)
            if draw:
                cv2.circle(img, (cx, cy), 5, (255, 0, 0), cv2.FILLED)
        return lmList
def main(file):
    cap = cv2.VideoCapture(file) 
    frame = 0
    detector = PoseDetector()

    while True:
        success, img = cap.read()
        img = detector.findPose(img)
        lmList = detector.getPosition(img)
        frame+=1
        cv2.putText(img, str(int(frame)), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
        cv2.imshow("Image", img)
        #cv2.waitKey(1)
        key = cv2.waitKey(1) & 0xFF

        if key== ord('q'):
            cv2.waitKey(0)
        if key== 27:
            break

    cap.release()
    cv2.destroyAllWindows()




if __name__=="__main__":
    file = "video/anime.mp4"
    main(file)

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佐倉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值