#开启摄像头
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)
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()函数即可。
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)
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文件中的命名都要正确才不会报错。
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)或者更大就没有问题。
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是正确的新名称。
概述
通过视频进行人体姿势估计在量化体育锻炼、手语识别和全身手势控制等各种应用中起着至关重要的作用。例如,它可以构成瑜伽,舞蹈和健身应用的基础。它还可以在增强现实中将数字内容和信息叠加在物理世界之上。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。