计算机视觉之手势、面部、姿势捕捉以 Python Mediapipe为工具
Mediapipe
库概述Mediapipe
是一个开源且强大的Python库,由Google开发和维护。它提供了丰富的工具和功能,用于处理实时多媒体数据。它可以帮助开发者快速构建各种视觉和音频处理应用,并允许他们灵活地定制和扩展库的功能。
Mediapipe库的主要功能包括:
本期博客,作者将分享使用Mediapipe
库实现手势、面部、动作识别的方法。
hands
)该段代码使用OpenCV
和MediaPipe
库来检测摄像头视频中的手部,并在图像上绘制关键点和连接线。
import cv2
import time
import mediapipe as mp
capture = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
pTime = 0
cTime = 0
while (capture.isOpened()):
retval, img = capture.read()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = hands.process(imgRGB)
if results.multi_hand_landmarks:
for handLms in results.multi_hand_landmarks:
for id, lm in enumerate(handLms.landmark):
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)
mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, "fps:"+str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 2,
(0, 0, 255), 2)
cv2.imshow("Video", img)
key = cv2.waitKey(1)
if key == 32:
break
capture.release()
cv2.destroyAllWindows()
效果展示:
关于代码,具体解释如下:
导入所需的库:
OpenCV
库。Python
标准库。MediaPipe
库,用于手部检测和姿态估计。创建视频捕获对象:
cv2.VideoCapture(0)
创建一个视频捕获对象,参数0表示使用默认摄像头。初始化MediaPipe手部检测器:
mp.solutions.hands.Hands()
创建一个手部检测器对象。hands.process(imgRGB)
将每个视频帧传递给检测器进行处理,并返回检测结果。处理每个视频帧:
capture.read()
读取视频帧,并将返回的结果存储在retval
和img
变量中。cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。hands.process(imgRGB)
对图像进行手部检测,返回结果保存在results
变量中。绘制检测结果:
results.multi_hand_landmarks
判断是否检测到了手部。handLms.landmark
遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。cv2.circle()
在图像中绘制关键点圆圈。mpDraw.draw_landmarks()
在图像中绘制手部关键点和连接线。计算帧率:
time.time()
获取当前时间戳,计算时间间隔以确定帧率。cv2.putText()
在图像上显示帧率。显示图像并等待按键:
cv2.imshow()
显示处理后的图像。cv2.waitKey(1)
等待用户按键,参数1表示等待1毫秒。释放资源:
capture.release()
释放视频捕获对象。cv2.destroyAllWindows()
关闭所有窗口。退出程序:
face
)该段代码使用OpenCV和MediaPipe库来检测摄像头视频中的人脸,并在图像上绘制人脸关键点和轮廓。
import cv2
import time
import mediapipe as mp
capture = cv2.VideoCapture(0)
mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh()
mpDraw = mp.solutions.drawing_utils
pTime = 0 # 上一帧的时间
cTime = 0 # 下一帧的时间
while (capture.isOpened()):
retval, img = capture.read()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = faceMesh.process(imgRGB)
if results.multi_face_landmarks:
for faceLms in results.multi_face_landmarks:
for id, lm in enumerate(faceLms.landmark):
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
# cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)
mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACEMESH_CONTOURS)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, "fps:" + str(int(fps)), (10, 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)
cv2.imshow("Video", img)
key = cv2.waitKey(1)
if key == 32:
break
capture.release()
cv2.destroyAllWindows()
以下是代码的解释:
导入所需的库:
创建视频捕获对象:
cv2.VideoCapture(0)
创建一个视频捕获对象,参数0表示使用默认摄像头。初始化MediaPipe人脸检测器:
mp.solutions.face_mesh.FaceMesh()
创建一个人脸检测器对象。faceMesh.process(imgRGB)
将每个视频帧传递给检测器进行处理,并返回检测结果。处理每个视频帧:
capture.read()
读取视频帧,并将返回的结果存储在retval
和img
变量中。cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。faceMesh.process(imgRGB)
对图像进行人脸检测,返回结果保存在results
变量中。绘制检测结果:
results.multi_face_landmarks
判断是否检测到了人脸。faceLms.landmark
遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。mpDraw.draw_landmarks()
在图像中绘制人脸关键点和轮廓。计算帧率:
time.time()
获取当前时间戳,计算时间间隔以确定帧率。cv2.putText()
在图像上显示帧率。显示图像并等待按键:
cv2.imshow()
显示处理后的图像。cv2.waitKey(1)
等待用户按键,参数1表示等待1毫秒。释放资源:
capture.release()
释放视频捕获对象。cv2.destroyAllWindows()
关闭所有窗口。退出程序:
pose
)该段代码使用OpenCV和MediaPipe库来检测摄像头视频中的人体姿势,并在图像上绘制关键点和连接线。
import cv2
import time
import mediapipe as mp
video = cv2.VideoCapture(0)
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utils
pTime = 0 # 上一帧的时间
cTime = 0 # 下一帧的时间
while True:
retval, img = video.read()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = pose.process(imgRGB)
if results.pose_landmarks:
for id, lm in enumerate(results.pose_landmarks.landmark):
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)
mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, "fps:" + str(int(fps)), (10, 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)
cv2.imshow("Video", img)
key = cv2.waitKey(10)
if key == 32:
break
video.release()
cv2.destroyAllWindows()
效果展示:
以下是代码的解释:
导入所需的库:
创建视频捕获对象:
cv2.VideoCapture(0)
创建一个视频捕获对象,参数0表示使用默认摄像头。初始化MediaPipe人体姿势检测器:
mp.solutions.pose.Pose()
创建一个人体姿势检测器对象。pose.process(imgRGB)
将每个视频帧传递给检测器进行处理,并返回检测结果。处理每个视频帧:
video.read()
读取视频帧,并将返回的结果存储在retval
和img
变量中。cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。pose.process(imgRGB)
对图像进行人体姿势检测,返回结果保存在results
变量中。绘制检测结果:
results.pose_landmarks
判断是否检测到了人体姿势。landmark
遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。cv2.circle()
在图像中绘制关键点圆圈。mpDraw.draw_landmarks()
在图像中绘制人体姿势关键点和连接线。计算帧率:
time.time()
获取当前时间戳,计算时间间隔以确定帧率。cv2.putText()
在图像上显示帧率。显示图像并等待按键:
cv2.imshow()
显示处理后的图像。cv2.waitKey(10)
等待用户按键,参数10表示等待10毫秒。释放资源:
video.release()
释放视频捕获对象。cv2.destroyAllWindows()
关闭所有窗口。退出程序:
附:侯小啾Python基础领航计划专栏已上线,特价专栏只需9.9即可扫清入门路上一切障碍。
跟着小啾,入门无忧!无论是系统化学习,还是碎片化学习都是很好的选择,点击下方链接即可订阅:
https://blog.csdn.net/weixin_48964486/category_12510091.html
更多精彩内容敬请期待,作者侯小啾持续为您推出!