人体姿态课程学习

DAY1

#开启摄像头

import cv2

cap = cv2.VideoCapture(0)
import cv2
import mediapipe as mp
import time


cap = cv2.VideoCapture(0)

while True:
    success, img = cap.read()


    cv2.imshow("Image", img)
    cv2.waitKey(1)

DAY2

import cv2
import mediapipe as mp
import time

cap = cv2.VideoCapture(0) #"调用摄像机的拍摄"

mpHands = mp.solutions.hands
hands = mpHands.Hands()

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #"将接口原本BGR模式转换为RGB模式(常用)"
    results = hands.process(imgRGB)


    cv2.imshow("Image", img)
    cv2.waitKey(1)
图片读取函数 读取结果类型 颜色空间
cv2.imread() numpy.ndarray BGR
cv2.VideoCapture() numpy.ndarray BGR
PIL(Python Image Library) PIL.Image.Image RGB

结论:OPENCV读取的图片不管是视频帧还是图片都是矩阵形式,即np.array。

如果转PIL.Image格式,用PIL.Image.fromarray()函数即可。

方案中的API

1.1参数配置
STATIC_IMAGE_MODE:如果设置为 false,该解决方案会将输入图像视为视频流。它将尝试在第一个输入图像中检测手,并在成功检测后进一步定位手的地标。在随后的图像中,一旦检测到所有 max_num_hands 手并定位了相应的手的地标,它就会简单地跟踪这些地标,而不会调用另一个检测,直到它失去对任何一只手的跟踪。这减少了延迟,非常适合处理视频帧。如果设置为 true,则在每个输入图像上运行手部检测,非常适合处理一批静态的、可能不相关的图像。默认为false。
MAX_NUM_HANDS:要检测的最多的手数量。默认为2。
MIN_DETECTION_CONFIDENCE:来自手部检测模型的最小置信值 ([0.0, 1.0]),用于将检测视为成功。默认为 0.5。
MIN_TRACKING_CONFIDENCE:来自地标跟踪模型的最小置信值 ([0.0, 1.0]),用于将手部地标视为成功跟踪,否则将在下一个输入图像上自动调用手部检测。将其设置为更高的值可以提高解决方案的稳健性,但代价是更高的延迟。如果 static_image_mode 为真,则忽这个参数略,手部检测将在每个图像上运行。默认为 0.5。
1.2输出
MULTI_HAND_LANDMARKS:被检测/跟踪的手的集合,其中每只手被表示为21个手部地标的列表,每个地标由x、y和z组成。x和y分别由图像的宽度和高度归一化为[0.0,1.0]。Z表示地标深度,以手腕深度为原点,值越小,地标离相机越近。 z的大小与x的大小大致相同。
MULTI_HANDEDNESS:被检测/追踪的手是左手还是右手的集合。每只手由label (标签)和score (分数)组成。 label 是“Left”或“Right”值的字符串。 score 是预测左右手的估计概率。
 

"调用摄像机的拍摄"和"将接口原本BGR模式转换为RGB模式(常用)"这两句话放在py文件中出现了问题,无效字符,应该使用井号键,#为备注的方式。
        self.hands = self.mpHands.Hands(self.mode, self.maxHands,
                                        self.detectionCon, self.trackCon)

#上行代码出现以下错误提示
TypeError: create_int(): incompatible function arguments. The following argument types are supported:
    1. (arg0: int) -> mediapipe.python._framework_bindings.packet.Packet

Invoked with: 0.5



#经过研究后,加入,False就可以运行,具体改为以下:
        self.hands = self.mpHands.Hands(self.mode, self.maxHands,False,
                                        self.detectionCon, self.trackCon)

DAY3

cv2.waitKey(1)函数的学习:

这个函数后面应该是cv::waitKey函数,它显示指定的图像毫秒。否则,它就不会显示图像。例如,waitKey(0)将无限地显示窗口,直到任何按键按下(它适合于图像显示)。waitKey(25)将显示一个框架。25毫秒后,显示将自动关闭。(如果你把它放到一个循环中去读视频,它将显示视频的帧逐。

结论:

1.waitKey()与waitKey(0),都代表无限等待,waitKey函数的默认参数就是int delay = 0,故这俩形式本质是一样的。

2.waitKey(n),等待n毫秒后,关闭显示的窗口。

学习调整显示页面的窗口:

import cv2
 
cap = cv2.VideoCapture('data/1.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    # 调整窗口大小
    cv2.namedWindow("frame", 0)  # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直
    cv2.resizeWindow("frame", 1600, 900)    # 设置长和宽
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
cap.release()
cv2.destroyAllWindows()

 在学习的代码中发现的错误:

angle < 0:被angle < 0代替了,需要改正。 

同理,如果angle > 0:被angle > 0代替了,也需要改正。

运行过程中发现代码不知道为什么会自动跑python库而不是python39库,因为我用的是python39跑姿态文件,mediepipe文件自然有所丢失,于是下载文件,并且失败后,出现以下错误:

for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11004] getaddrinfo failed

因此缺失姿态文件,到以下地址下载:https://gitee.com/mirrors/mediapipemediapipe: MediaPipe 是一个基于图形的跨平台框架,用于构建多模式(视频,音频和传感器)应用的机器学习管道 (gitee.com)https://gitee.com/mirrors/mediapipe

出现以下错误报错:

error: OpenCV(4.5.2) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-_8k9tw8n\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
 

结论:大概率是图片or视频的存放路径出现问题,如:未找到命名文件。在两个py文件中的命名都要正确才不会报错。 

DAY4

import cv2
import mediapipe as mp
import time

cap = cv2.VideoCapture("Videos/1.mp4")
pTime = 0
while True:
    success, img = cap.read()

    cTime = time.time()
    fps = 1/(cTime-pTime)
    pTime = cTime
    cv2.putText(img,f'FPS: {int(fps)}', (20, 70), cv2.FONT_HERSHEY_PLAIN,
                3, (255, 0, 0), 2)

    cv2.imshow("Image", img)
    cv2.waitKey(1)

以上代码段出现下面报错:

        fps = 1/(cTime-pTime)
        ZeroDivisionError: float division by zero

解决方式:将最后一行cv2.waitKey(1)改为cv2.waitKey(10)或者更大就没有问题。

DAY5

import cv2
import mediapipe as mp
import time

cap = cv2.VideoCapture("Videos/1.mp4")
pTime = 0

mpDraw = mp.solutions.drawing_utils
mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh(max_num_faces=2)

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = faceMesh.process(imgRGB)
    if results.multi_face_landmarks:
        for faceLms in results.multi_face_landmarks:
            mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACE_CONNECTIONS)

    cTime = time.time()
    fps = 1/(cTime-pTime)
    pTime = cTime
    cv2.putText(img, f'FPS: {int(fps)}', (20,70), cv2.FONT_HERSHEY_PLAIN,
                3, (0, 255, 0), 3)
    cv2.imshow("Image", img)
    cv2.waitKey(10)

错误提示:    mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACE_CONNECTIONS)
Error: module 'mediapipe.python.solutions.face_mesh' has no attribute 'FACE_CONNECTIONS'

更新:FACEMESH_CONTOURS是正确的新名称。

DAY6

MediaPipe Pose

概述

通过视频进行人体姿势估计在量化体育锻炼、手语识别和全身手势控制等各种应用中起着至关重要的作用。例如,它可以构成瑜伽,舞蹈和健身应用的基础。它还可以在增强现实中将数字内容和信息叠加在物理世界之上。MediaPipe Pose是一种用于高保真身体姿势跟踪的ML解决方案,利用我们的BlazePose研究,从RGB视频帧中推断出整个身体上的33个3D地标和背景分割蒙版,该研究也为ML Kit Pose Detection API提供支持。目前最先进的方法主要依靠强大的桌面环境进行推理,而我们的方法在大多数现代手机,台式机/笔记本电脑,python甚至网络上实现实时性能。

机器学习管道

该解决方案采用两步检测器-跟踪器 ML 管道,在我们的 MediaPipe 手和 MediaPipe 面网格解决方案中被证明是有效的。使用检测器,管道首先在框架内定位感兴趣的人/姿势区域(ROI)。跟踪器随后使用ROI裁剪的帧作为输入来预测ROI中的姿势地标和分割掩码。请注意,对于视频用例,仅在需要时调用检测器,即,对于第一帧以及跟踪器无法再识别前一帧中的身体姿势存在时。对于其他帧,管道仅从前一帧的姿势地标派生 ROI。管道实现为 MediaPipe 图,该图使用姿势地标模块中的姿势地标子图,并使用专用的姿势渲染器子图进行渲染。姿势地标子图内部使用来自姿势检测模块的姿势检测子图。

​​​​​​​调整视频框:

        # 打开一个Image窗口显示视频图片,视频框大小无法调整。
        cv2.namedWindow("Image", 0)  # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直
        cv2.resizeWindow("Image", 750, 550)  # 设置宽和长
        cv2.imshow('Image', img)


        # 打开一个Image窗口显示视频图片,视频框大小可调整。
        cv2.namedWindow("Image", 0)  # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直
        cv2.imshow('Image', img)


        cv2.putText(img, str(int(count)), (w // 30, h // 3), cv2.FONT_HERSHEY_SIMPLEX, 5, (255, 255, 255), 10, cv2.LINE_AA)
        #(w // 30, h // 3)以右下角为原点,先走w,再走h。

你可能感兴趣的:(大数据)