mediapipe手语识别项目(一)

首先介绍一下mediapipe库:

MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 、Google Lens、ARCore、Google Home 以及 ,都已深度整合了 MediaPipe。

就简单来说,这个东西直接pip install mediapipe库就解决问题,可以识别到人身上各个位置的关键点,如图:

mediapipe手语识别项目(一)_第1张图片

首先从简单做起:

1.识别图片里人像的关键点

import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_holistic = mp.solutions.holistic

file = '4.jpg'
holistic = mp_holistic.Holistic(static_image_mode=True)

image = cv2.imread(file)
image_hight, image_width, _ = image.shape
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = holistic.process(image)

 首先,我们导入需要的第三方库,并配置一下需要画图的点的尺寸,线的尺寸以及颜色等,这些信息都可以自行修改,这里我们直接引用官方的配置进行设计(mp.solutions.drawing_utils函数)

当然我们如何修改画图的点的尺寸和颜色等信息呢:

可以参考drawing_utils里面的参数进行修改就可以

然后定义一个holistic检测模型函数:这里就是定义了一个函数然后使用我们前期介绍的opencv的相关知识从系统中读取我们需要检测的图片,并获取图片的尺寸

mp_holistic = mp.solutions.holistic

file = '4.jpg'
holistic = mp_holistic.Holistic(static_image_mode=True)
image = cv2.imread(file)
image_hight, image_width, _ = image.shape

 

由于OpenCV默认的颜色空间是BGR,但是一般我们说的颜色空间为RGB,这里mediapipe便修改了颜色空间

然后使用我们前面建立的holistic检测模型,对图片进行检测即可

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = holistic.process(image)

 模型检测完成后的结果保存在results里面,我们需要访问此结果,并把检测到的人脸,人手,以及姿态评估的数据点画在原始检测的图片上,以便查看

if results.pose_landmarks:
  print(
f'Nose coordinates: ('
f'{results.pose_landmarks.landmark[mp_holistic.PoseLandmark.NOSE].x * image_width}, '
f'{results.pose_landmarks.landmark[mp_holistic.PoseLandmark.NOSE].y * image_hight})'
)
annotated_image = image.copy()
mp_drawing.draw_landmarks(
annotated_image, results.face_landmarks, mp_holistic.FACE_CONNECTIONS)
mp_drawing.draw_landmarks(
annotated_image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
annotated_image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
annotated_image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)

 这里我们打印了图片检测的结果,并分别画出人脸检测模型数据,人左右手的检测数据,以及人体姿态检测数据

#cv2.imshow('annotated_image',annotated_image)
cv2.imwrite('4.png', annotated_image)
cv2.waitKey(0)
holistic.close()

 画图完成后,我们可以显示图片方便查看,也可以直接使用OpenCV的imwrite 函数进行结果图片的保存,最后只需要holistic.close()检测模型

2.加大一点难度:识别视频里人的特征关键点

 

import cv2
import time
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_holistic = mp.solutions.holistic

holistic = mp_holistic.Holistic(
min_detection_confidence=0.5, min_tracking_confidence=0.5)

 首先跟图片检测一致,我们建立一个holistic检测模型,然后便可以打开摄像头进行模型的检测

cap = cv2.VideoCapture(0)
time.sleep(2)
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
continue
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = holistic.process(image)

首先我们打开默认摄像头,并从摄像头中获取检测的实时图片 

cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()

检测到图片后,我们便可以直接使用图片检测的步骤,进行模型的检测

image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = holistic.process(image)

这里我们使用到了cv2.flip(image, 1)图片翻转函数来增强数据图片,由于我们摄像头中的影像跟我们是镜像关系 

 mediapipe手语识别项目(一)_第2张图片

 

cv2.flip(image, 1)

使用此函数便可以镜像我们的图片影像,最后把图片赋值给holistic模型进行检测

image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
mp_drawing.draw_landmarks(
image, results.face_landmarks, mp_holistic.FACE_CONNECTIONS)
mp_drawing.draw_landmarks(
image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)
cv2.imshow('MediaPipe Holistic', image)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
holistic.close()
cap.release()

 以上这些来源于知乎大佬的分享,深受启迪,搞个链接:MediaPipe 集成人脸识别,人体姿态评估,人手检测模型 - 知乎 (zhihu.com)

你可能感兴趣的:(python,opencv,计算机视觉)