本文为稀土技能社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
beginning
不知道小伙伴们有没有用手势操控各种智能设备的体会,例如,经过手势来操控智能电视的界面、音量和频道;在虚拟现实游戏中,运用手势开释技能、抓取物品等;在医疗恢复中,经过手势协助恢复患者进行手部运动训练,这些都是三维手部要害点检测技能在咱们生活中的使用。今日呢就带领大家从零上手,完成基于Mediapipe的手部要害点三维实时检测,经过计算机视觉和深度学习,智能定位出21个手部要害点的三维坐标,完成手势操控、手语翻译、动作捕捉、穴道定位、增强现实人机交互等巨大上的前沿黑科技。废话不多说啦,假如你也对此感兴趣,想一睹它的风貌,让咱们一同愉快的学习叭
本文盆友们能学到:
- 体会Web网页三维手部要害点实时检测的Demo
- 读取图画文件,输入模型,获取21个要害点和手部骨骼,可视化
- 用电脑摄像头实时检测,获取21个要害点和手部骨骼,可视化。
1.Web网页Demo体会
今儿咱们要学的三维手部要害点检测是基于Mediapipe完成滴,那什么是MediaPipe腻MediaPipe是谷歌开源的工具包,它功用非常强壮,有许多内置的solution,比方人脸检测、眼球运动检测、手部要害点检测、人体姿势估计、头发切割、方针检测等等。它让咱们能够很方便地完成这些个功用,而不需要从零开始编写代码。这么强壮灵敏的工具,赶忙放个链接:Mediapipe主页、Github主页。
提到这,你是不是刻不容缓地想试一试手部检测啦,这儿给盆友们供给一个Web网页➡codepen.io/tommyzihao/… 能够直接把链接复制在自己的浏览器里边就能够运转啦,不需要装置配置环境,直接调用摄像头在浏览器前端就能够看到检测作用辽(有些盆友翻开页面或许会一向显现Loading,封闭再翻开试试,形而上学)如下所示:
作用是很不错滴,你能够试试把大拇指藏起来看算法会不会兼容。不仅如此,它还有三维作用腻。三维作用是说要害点离手腕越远而且越靠近摄像头,那么它的要害点的半径就越大,越远离摄像头就越小,也便是说它能够获得深度信息。你也能够在页面的左边修正置信度阈值,当阈值特别小的时候呢,它会把人的脸也当成是手,所以置信度阈值不能设置的太小,0.7就很合适。除此之外,还能够分左右手,颜色等设置的信息能够在上面显现的代码中修正。心动不如行动,赶忙着手玩玩叭(再给小伙伴们供给一个官网里的擦冰花游戏:趣味擦冰花)
现在咱们来看看三维手部要害点检测到底是一个什么问题,下图是一个终究的作用。为什么叫三维要害点呢?除了xy坐标,每一个要害点还会获得相关于手腕的深度信息,也便是z坐标(就像下图中相似铜钱那样,相关于手腕的间隔越远且越靠近摄像头,铜钱就越大)。MediaPipe的手部要害点能够回来21个手部要害点的信息,这21个要害点分别是手腕一个点,其他五根指头每根指头上有四个点。由这21个要害点的连线就能够构建整个手的骨架,而且依据这21个点之间的联系能够建模,构建出一个手势辨认的功用。在它的论文里呢还展现出了一个增强现实的功用,为人机交互供给了新的渠道(关于它的论文和原理,下次安排上)
2.单张图片检测
Mediapipe手部要害点检测官方教程:google.github.io/mediapipe/s…
体会过demo之后,下面让咱们自己学着着手完成三维手部检测叭进行检测前需要装置配置环境,在已有python环境的前提下,翻开windows命令提示符,输入以下命令装置第三方库:
pip install mediapipe opencv-python numpy matplotlib tqdm jupyter notebook -i https://pypi.tuna.tsinghua.edu.cn/simple
1.导入工具包:\color{blue}{1. 导入工具包:}
import cv2
import mediapipe as mp
from tqdm import tqdm
import time
import matplotlib.pyplot as plt
# 运用ipython魔法办法,将制作出的图画直接嵌入在notebook单元格中
%matplotlib inline
# 界说可视化图画函数
def look_img(img):
'''opencv读入图画格局为BGR,matplotlib可视化格局为RGB,因而需将BGR转RGB'''
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_RGB)
plt.show()
上述命令先导入各种工具包——opencv-python、mediapipe、进度条库、时间库、matplotlib(画图库),最后的百分号是一个ipython魔法办法,将matplotlib制作出的图画直接嵌入在notebook单元格中。运转之后再界说一个可视化图画函数,这个函数输入的是数组形式的图画,它会把这个图画展现出来,仅此而已。
2.导入手部要害点检测模型:\color{blue}{2. 导入手部要害点检测模型:}
# 导入solution
mp_hands = mp.solutions.hands
# 导入模型
hands = mp_hands.Hands(static_image_mode=False, # 是静态图片仍是接连视频帧
max_num_hands=4, # 最多检测几只手
min_detection_confidence=0.5, # 置信度阈值
min_tracking_confidence=0.5) # 追寻阈值
# 导入绘图函数
mpDraw = mp.solutions.drawing_utils
首先从mediapipe的solution里边挑选hands,再导入模型,从mp.hands里边界说一个模型实例Hands,这儿就需要配置一下模型的四个参数。第一个参数是静态图片仍是接连视频帧,假如是False的话表明是接连视频帧,它就会按照接连视频帧那样从上一帧要害点推断出手部的方位,再送给下一帧用于猜测;假如是True的话,表明你处理的帧与帧之间的图片是不相同的,它会每一次先过一遍手掌检测,然后再把手掌检测的成果喂给要害点检测模型(这儿涉及到原理部分,暂时听不懂没联系滴),很明显会比较慢。第二个参数是最多检测几只手,2或4都可,假如太大的话算法或许就会不太稳定,检测的成果或许会颤动的比较厉害。第三个参数是置信度阈值,这儿引荐0.7最合适;第四个参数是追寻阈值,这个阈值越大,它追寻的作用就会好,算法就会越鲁棒(but速度会变慢),这儿挑选默认值就能够
3.读入图画:\color{blue}{3. 读入图画:}
# 从图片文件读入图画,opencv读入为BGR格局
img = cv2.imread('./images/camera1.jpg')
# 水平镜像翻转图画,使图中左右手与真实左右手对应
# 参数 1:水平翻转,0:竖直翻转,-1:水平和竖直都翻转
img = cv2.flip(img, 1)
look_img(img)
在images文件夹里有一个camera1图画(这儿设置你自己的图片即可),咱们用opencv-python中的cv2.imread把它读入进来。为了让左右手能够跟猜测成果对应上,需要把图画水平翻转一下,这儿用的是opencv的flip,1表明水平翻转,0表明竖直翻转,-1表明都翻转。运转就会看到一个翻转后的图画。
4.将图画输入模型,获取猜测成果:\color{blue}{4. 将图画输入模型,获取猜测成果:}
# BGR转RGB
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 将RGB图画输入模型,获取猜测成果
results = hands.process(img_RGB)
# 猜测出手的个数
len(results.multi_hand_landmarks)
这个模型只承受RGB格局的,可是opencv读入的时候进来的是BGR格局,所以咱们需要先把BGR格局转成RGB,就相当于把它第一个通道和第三个通道交换一下。然后把RGB格局的数据喂到模型里边,获取了results,一切的猜测成果都在这个results里边。比方用len()看看它的长度,运转一下,成果是2,就代表检测出两只手。
5.可视化检测成果:\color{blue}{5. 可视化检测成果:}
if results.multi_hand_landmarks: # 假如有检测到手
# 遍历每一只检测出的手
for hand_idx in range(len(results.multi_hand_landmarks)):
hand_21 = results.multi_hand_landmarks[hand_idx] # 获取该手的一切要害点坐标
mpDraw.draw_landmarks(img, hand_21, mp_hands.HAND_CONNECTIONS) # 可视化
look_img(img)
下面就可视化检测成果了。代码第一行的if results.multi_hand_landmarks:这个变量的成果非空,那么就持续下面的操作。这时候你或许会问,那我能不能写成if 它的长度大于0呢理论上是能够滴,可是假如它没有检测出任何手的话,那这个变量并不具备len,就不能用len()来操作它,所以没有手的话就会报错辽,倒不如直接看这个变量是不是空就能够啦(真妙哇)。假如它检测到有手的话,就遍历变量里的每一只手,获取该手的一切要害点坐标。最后用刚开始导入的mpDraw画要害点。其中draw_landmarks()接纳三个参数,第一个是要画的图,第二个是要害点,第三个为是否要制作骨架,也便是要害点之间的连线。运转后就画出了终究的作用啦
3.摄像头实时检测
学完图片检测之后,摄像头实时检测就非常简单啦➡调用电脑的摄像头实时地获取一帧一帧的画面,每一帧画面呢都是一个静态的图画,每一帧画面就用上一节讲过单帧图画的处理办法来处理和可视化,再把这些处理过的可视化图画连成一个视频,而且实时的展现出来。理论上是这样,可是代码或许会更加杂乱,因为牵涉到摄像头的读入。不过,有难度才有挑战性嘛,一同持续看看叭
1.导入工具包和模型\color{blue}{1. 导入工具包和模型}
这儿和上节检测单张图片的代码块相同相同滴,就不赘述啦
2.处理单帧的函数\color{blue}{2. 处理单帧的函数}
def process_frame(img):
# 水平镜像翻转图画,使图中左右手与真实左右手对应
# 参数 1:水平翻转,0:竖直翻转,-1:水平和竖直都翻转
img = cv2.flip(img, 1)
# BGR转RGB
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 将RGB图画输入模型,获取猜测成果
results = hands.process(img_RGB)
if results.multi_hand_landmarks: # 假如有检测到手
# 遍历每一只检测出的手
for hand_idx in range(len(results.multi_hand_landmarks)):
hand_21 = results.multi_hand_landmarks[hand_idx] # 获取该手的一切要害点坐标
mpDraw.draw_landmarks(img, hand_21, mp_hands.HAND_CONNECTIONS) # 可视化
# 在三维坐标系中可视化索引为0的手
# mpDraw.plot_landmarks(results.multi_hand_landmarks[0], mp_hands.HAND_CONNECTIONS)
return img
这儿界说了一个处理单帧的函数,输入的是摄像头捕获的画面,输出的是可视化处理之后的图画。函数里边的代码是不是看着很眼熟腻,没戳,和上节代码也是相同滴(这不就大大减少了工作量)
3.调用摄像头获取每帧(模板)\color{blue}{3. 调用摄像头获取每帧(模板)}
# 不需修正任何代码,只需修正process_frame函数即可
# 导入opencv-python
import cv2
import time
# 获取摄像头,传入0表明获取体系默认摄像头
cap = cv2.VideoCapture(1)
# 翻开cap
cap.open(0)
# 无限循环,直到break被触发
while cap.isOpened():
# 获取画面
success, frame = cap.read()
if not success:
print('Error')
break
## !!!处理帧函数
frame = process_frame(frame)
# 展现处理后的三通道图画
cv2.imshow('my_window',frame)
if cv2.waitKey(1) in [ord('q'),27]: # 按键盘上的q或esc退出(在英文输入法下)
break
# 封闭摄像头
cap.release()
# 封闭图画窗口
cv2.destroyAllWindows()
上述代码调用摄像头获取每一帧,然后再把每一帧喂到上次界说的处理单帧函数process_frame()里边,把这个函数回来的可视化成果实时地展现在电脑屏幕my_window上。其实上述这个函数是一个通用的模板,你今后不管做任何任务,只要是opencv调用摄像头实时的获取画面来处理,都能够用这个模板腻⛳⛳⛳运转之后就能够完成摄像头实时三维手部要害点检测啦,快快来试试叭
4.潜在使用
除了技能自身之外,那么三维手部要害点检测有哪些潜在使用呢?这儿盆友们能够大开一下脑洞嗷:
- 手势操控:隔空截屏翻页、无人机操控、智能家居操控
- 动作捕捉:电影拍照、短视频特效、增强现实
- 手部穴道按摩机器人、手部针灸机器人、恢复精准医疗
- 手语翻译、手势翻译
- 是否天然生成合适学钢琴、吉他……
我感觉这些好好用喔,其中有些应该现已完成了就像第一个隔空截屏翻页,比方你正在吃小龙虾,手黏黏糊糊的不方便碰手机,那么能够用隔空握拳截屏或许翻页这样的功用来操控;比方说无人机操控,你能够挥挥手,它就离你远去啦;再比方动作捕捉,因为咱们能把手部的骨架提取出来,那把这个骨架再包上一层野兽或许外星人的皮郛,就能够获取它的动作,再结合物理引擎完成增强现实,这在电影拍照、短视频特效里边是非常重要滴;使用在医疗领域的手势辨认,掉包速成,模型非常快,cpu跑起来的速度也不差,是一个真正好的落地场景;别的有的钢琴家,他的手就天然生成长得很合适弹钢琴,手大到能够横跨14个键,天然生成就合适弹跨音高的曲……
关于游戏爱好者来说,三维手部要害点检测也有很大用处,比方用在VR设备替换掉手柄(或许做游戏主机waigua),这种技能在游戏规划尤其是手游上倒是能打破不少操作空间上的局限,从而开辟游戏规划玩法
ending
看到这儿相信盆友们都能完成三维手部要害点检测啦,是不是满满的成就感不过或许也有小伙伴说“这不便是调包而已”,咦咦咦,此言差矣,你是省略了要调包之前的学习本钱,要调这个包之前是要学许多东西滴,咱又不是用机器语言写代码的大佬。何况,有没有这么一种或许,咱们的互联网大厂,本质上也是在“调包”腻(狗头保命)学完了代码之后,下一期就和盆友们分享三维手部要害点检测背后的原理,尽请等待叭
很高兴能把学到的知识以文章的形式分享给大家。假如你也觉得我的分享对你有所协助,please一键三连嗷!!!下期见