首先介绍一下mediapipe库:
MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 、Google Lens、ARCore、Google Home 以及 ,都已深度整合了 MediaPipe。
就简单来说,这个东西直接pip install mediapipe库就解决问题,可以识别到人身上各个位置的关键点,如图:
首先从简单做起:
1.识别图片里人像的关键点
import cv2import mediapipe as mpmp_drawing = mp.solutions.drawing_utilsmp_holistic = mp.solutions.holistic file = '4.jpg'holistic = mp_holistic.Holistic(static_image_mode=True) image = cv2.imread(file)image_hight, image_width, _ = image.shapeimage = 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 cv2import timeimport mediapipe as mpmp_drawing = mp.solutions.drawing_utilsmp_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.")continueimage = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)image.flags.writeable = Falseresults = 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 = Falseresults = holistic.process(image)
这里我们使用到了cv2.flip(image, 1)图片翻转函数来增强数据图片,由于我们摄像头中的影像跟我们是镜像关系
cv2.flip(image, 1)
使用此函数便可以镜像我们的图片影像,最后把图片赋值给holistic模型进行检测
image.flags.writeable = Trueimage = 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'):breakholistic.close()cap.release()
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删