Mediapipe
安装Mediapipe
- 打开Anaconda prompt
- 检查环境和python运行环境是否一致(默认base环境,不用切换)
- 输入命令行
pip install mediapipe==0.9.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
Mediapope完成手部关键点检测
手部检测
- 创建对象(加载模型参数) mp.solutions.hands.Hands()
- 图像通道更换(BGR --> RGB) cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
- 获得手部标志 result = hand.process(frame_rgb)
- 获得手部关键点 result.multi_hand_landmarks
- 获得左手关键点 hand_landmarks = result.multi_hand_landmarks[0]
- 绘制样式 mp.solutions.drawing_utils.draw_landmarks
- 参数1 样式绘制的图像
- 视频捕捉的图像 frame
- 参数2 左手关键点
- hand_landmarks
- 参数3 连接点
- cnn = mp.solutions.hands_connections.HAND_CONNECTIONS
- 参数4 关键点样式
- lm_style = mp.solutions.drawing_styles.DrawingSpec()
- 参数5 连接线样式
- cnn_style = mp.solutions.drawing_styles.DrawingSpec(color=(255, 0, 0))
- 参数1 样式绘制的图像
视频捕捉
- 初始化手部检测属性
- self.hand = HandProcess()
- 打开摄像头 cap = cv2.VideoCapture(0)
- 0 表示打开本地摄像头
- 1 2 3 外接摄像头
- 路径/播放视频
- 循环一帧一帧读取图像 while cap.isOpened():
- 获得图像 retval, frame = cap.read()
- 手部检测 self.hand.process(frame)
- 显示图像 cv2.imshow(‘frame’, frame)
- 等待显示 key = cv2.waitKey(25)
- if key == ord(‘z’): break
- 释放摄像头 cap.release()
- 释放显示窗口 cv2.destroyAllWindows()
动作识别分析
- 准备数据(标准动作/标签)
- 录制视频,某个动作的视频帧较多(50帧),抽取出(5帧)作为标准的动作
- 视频保存一帧一帧图像 OpenCV
- 间隔时间保存
- 根据标签提取特征(向量vector)
- 保存提取出来的特征(db_feats)
- 当前的动作(图像/某帧)提取特征(feat)
- 当前的feat和已存储的db_feats进行比较
- 范式/距离
- 余弦定理 v1和v2作比较 cos 0-1 (1为最相似)
- 模块分析
- 视频采集 video_process
- 循环一帧一帧读取图像 capture()
- 继承修改 process() 用于 pose_rec 调用识别
- 动作识别 pose_rec
- 存放 frame_feat 对象
- 调用 recognize() 进行识别,获得 cal_similarity() 预测动作
- 提取图像特征 frame_feat
- 获得关键点 get_pose_landmark
- 获得图像特征 get_frame_feat
- 加载标准数据库 load_db_feat
- 相似度比较 cal_similarity
- 视频采集 video_process