目录
一、开发环境
二、手势识别的概述
三、Hand Landmark模型
四、工具和依赖库安装
4.1 python下载及安装:
4.2 pycharm 安装
五、多手势识别源码
5.1 源码使用注意事项
5.2 运行效果展示
一、开发环境
1、pycharm
2、python3.9
3、opencv-python
4、mdiapipe-0.8.3
二、手势识别的概述
感知手的形状和运动的能力是改善各种技术领域和平台的用户体验的重要组成部分。例如,它可以形成手语理解和手势控制的基础,还可以在增强现实中实现数字内容和信息在物理世界之上的叠加。
MediaPipe Hands是一款高保真的手和手指跟踪解决方案。它使用机器学习(ML)从单个帧中推断出21个手的3D地标。当前最先进的方法主要依赖于强大的桌面环境进行推理,并且在移动电话上实现了实时性能,甚至可以扩展到多手。
三、Hand Landmark模型
在整个图像上进行手掌检测之后,Hand Landmark模型通过回归对检测到的手区域内的21个3D手关节坐标进行精确的关键点定位,即直接坐标预测。
为了获得训练的真实数据,使用了21个3D坐标手动标注了约30K幅真实的图像,如下所示(如果它存在于对应的坐标中,从图像中获取Z值)。为了更好地覆盖手部姿势,并提供对手部几何特性的额外监督,我们还可以在各种背景上渲染高质量的合成手部模型,并将其映射到相应的3D坐标。
四、工具和依赖库安装
4.1 python下载及安装:
- 官网下载(现在的电脑基本都支持64bit):
- 下载后双击运行,记得先勾选 “Add Python 3.9 to PATH ”,再点击 “Install Now” 安装。
4.2 pycharm 安装
- 官网下载(默认安装即可)
五、多手势识别源码
import cv2
import mediapipe as mp
import time
class handDetector():
def __init__(self, mode=False, maxHands=2, complexity=1, detectionCon=0.5, trackCon=0.5):
# 初始化类的参数
self.mode = mode
self.maxHands = maxHands
self.complexity = complexity
self.detectionCon = detectionCon
self.trackCon = trackCon
# 初始化手跟踪模块
self.mpHands = mp.solutions.hands
# mediapipe version: 0.8.11
# self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.complexity,
# self.detectionCon, self.trackCon)
# mediapipe version: 0.8.3
self.hands = self.mpHands.Hands(self.mode, self.maxHands,
self.detectionCon, self.trackCon)
self.mpDraw = mp.solutions.drawing_utils
# 跟踪手关节点位置
def findHands(self, img, draw=True):
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results = self.hands.process(imgRGB)
if self.results.multi_hand_landmarks:
for handLms in self.results.multi_hand_landmarks:
if draw:
self.mpDraw.draw_landmarks(img, handLms,
self.mpHands.HAND_CONNECTIONS)
return img
# 对手关节点绘制圆圈
def findPostion(self, img, handNo=0, draw=True):
lmList = []
if self.results.multi_hand_landmarks:
for myHand in self.results.multi_hand_landmarks:
for id, lm in enumerate(myHand.landmark):
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
lmList.append([id, cx, cy])
if draw:
cv2.circle(img, (cx, cy), 12, (255, 0, 255), cv2.FILLED)
return lmList
def main():
pTime = 0
cTime = 0
# 打开摄像机Camera0
cap = cv2.VideoCapture(0)
# 实例化类对象
detector = handDetector()
while True:
# 读取摄像机的视频图像
success, img = cap.read()
# 跟踪关节点位置
img = detector.findHands(img)
# 对手关节点绘制圆圈
lmList = detector.findPostion(img)
# 计算实时帧率
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
# 显示实时帧率
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 2,
(255, 0, 255), 2)
# 显示视频图像
cv2.imshow("Image", img)
cv2.waitKey(1)
if __name__ == "__main__":
main()
5.1 源码使用注意事项
- 本例程是基于 mediapipe-0.8.3 版本实现的 ,同时也兼容了 0.8.11 版本的代码实现。
- 如果你已安装了 mediapipe-0.8.11 版本,可将已注释掉的代码打开,并将 0.8.3 版本相关的实现代码注释掉即可。
- 0.8.11 比 0.8.3 版本多了一个 complexity 参数,同时手掌标识号的顺序也存在差异。
5.2 运行效果展示
文章来源:https://www.toymoban.com/news/detail-454033.html
文章来源地址https://www.toymoban.com/news/detail-454033.html
到了这里,关于opencv之(多)手势识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!