基于MediaPipe的Python编程手势识别应用
作者 牟奕炫
发表于 2023年4月

MediaPipe 是一个以视觉算法为核心的机器学习工具库,集成了包括人脸及关键点检测、手势和姿态的检测与识别等多种模型的训练数据,识别的运行速度非常快,尤其适用于实时监控和流媒体视频画面内容的检测和识别。

以识别与检测人的单只手掌为例,MediaPipe 中的训练数据会识别出总共21 个手指关键点(标注为0-20),比如0 号点是WRIST( 腕关节),7 号点是INDEX_FINGER_DIP(食指下第一关节),16 号点是RING_FINGER_TIP(无名指指尖)(如图1)。

一、在Windows中識别关键点与标注

1. 前期的准备工作

台式机接好摄像头或使用笔记本电脑;在CMD 窗口定位至Python3.8 的安装路径, 用“pip install mediapipe” 安装MediaPipe。根据Python 环境安装或升级matplotlib 等相关库,注意确保提前安装好OpenCV, 直至“Successfullyinstalled”的成功提示。

启动PythonIDLE,新建文件开始程序代码的编写及运行测试。

2. 检测单(双)手并进行关键点的标注及连线

导入OpenCV 和MediaPipe 库模块; 定义变量camera, 并赋值为0,如果默认的摄像头编号不是0则更改为1, 打开摄像头; 建立变量hand_detector,用于创建检测人手关键点的检测对象,判断并获取视频画面中是否有符合“手”特征的信息,该参数保持为空时默认状态是“model_complexity=0,min_detection_confidence=0.5,min_tracking_confidence=0.5”,分别表示动态画面跟踪速度增益、检测及跟踪的置信度。

在循环中, 通过语句“ret,img =camera.read()” 实现对摄像头所拍摄画面的数据读取; 变量img_rgb, 用于将OpenCV 读取的BGR 模式图像转换为常规的RGB 模式; 变量result, 通过检测模型来提取变量img_rgb 所存储的图片信息(比如每帧画面检测出几只手);每次在检测到画面中出现一只手时,就可以通过语句“print(result.multi_hand_landmarks)”来打印输出对应的数据信息:一个内嵌有21 个字典数据(对应手的21个关键点)的列表,其中的每个字典均包含一组相对位置信息,形式为“landmark{x:0.8149930238723755,y:0.7734243273735046,z:-0.11069273203611374}”,其中的x、y 分别表示该点在视频画面中位置的百分比,z 表示该点距离摄像头的远近。在内嵌的“for handlms in result.multi_hand_landmarks:” 循环中, 语句“mp.solutions.drawing_utils.draw_landmarks(img,handlms,mp.solutions.hands.HAND_CONNECTIONS)”的作用是在img 图片上进行“作画”操作,其中的参数handlms 对应的是每个关键点(默认为红色小圆点),参数mp.solutions.hands.HAND_CONNECTIONS 对应的是相邻两个关键点进行连线(默认为白色细线段)。

语句“cv2.imshow('Video',img)” 是Python 调用OpenCV 的常规操作,对应的功能是将摄像头捕获的画面(包括使用MediaPipe 进行画点和连线的内容)输出显示在电脑屏幕上;变量k 的值为“cv2.waitKey(1)”,等待键盘响应事件时间为1毫秒,如果检测到用户按下了q 键(“if k== ord('q'):”)则执行break 跳出“whileTrue:”循环;语句“camera.release()”和“cv2.destroyAllWindows()”的功能是分别对应释放摄像头资源和关闭Video 监控窗口。

程序保存为“[01]Get_Points_Draw_Lines.py”并运行:当手掌朝向摄像头,在监控窗口中会即时标注有21 个关键点以及白色连接线;当手背朝向摄像头或者同时伸出两只手时,程序能否正常捕捉和标注;此时还会在PythonShell 窗口中不断显示有“Squeezed text(106 lines)”模块信息,双击即可显示其详细数据内容,即对应21 个关键点的landmark 列表(如图2)。

本文刊登于《电脑报》2023年14期
龙源期刊网正版版权
更多文章来自
订阅