OpenCV手部关键点检测(手势识别)代码示例

Stella981
• 阅读 1314

点击我爱计算机视觉标星,更快获取CVML新技术


前几日分享了learnopencv.com博主Satya Mallick发表的关于OpenCV Mask RCNN实例分割的博文(详见:OpenCV4.0 Mask RCNN 实例分割示例 C++/Python实现),展示了OpenCV作为DNN推断工具的简单用法。
昨日Satya Mallick又发表了使用OpenCV调用OpenPose工程中的手部关键点检测(hand pose estimation)模型的文章,对于想要使用手部关键点检测做手势识别、手语识别、抽烟检测等工程开发的朋友来说这是一个非常简单的上手教程。
先来看看作者发布的视频效果:

在大部分情况下还是不错的,但也出现了少数帧关键点跳变的情况。

算法思想
该文中作者使用的算法模型是CMU Perceptual Computing Lab开源的集合人体、人脸、手部关键点检测的开源库OpenPose,其中手部关键点检测(Hand Keypoint detector)算法来自CVPR2017的论文《Hand Keypoint Detection in Single Images using Multiview Bootstrapping》。
人手在3D空间由于视角不同、灵活的精细动作等原因,较难得到精确标注的数据集。在该论文中,作者提出了一种称之为Multiview Bootstrapping的手部关键点检测迭代改进算法,实现了具有较高精度的检测算法。     OpenCV手部关键点检测(手势识别)代码示例
如上图所示,作者提出首先使用少量标注的含有人手关键点的数据集训练Convolutional Pose Machines神经网络,使用31个不同视角的高清摄像头拍摄人手,用上述检测模型初步检测关键点,将这些关键点根据摄像机的位姿构建三角(triangulation),得到关键点的3D位置,再将计算得到的3D点位置重投影到每一幅不同视角的2D图像,再使用这些2D图像和关键点标注训练检测模型网络,经过几次迭代,即可以得到较为精确的手部关键点检测模型。
原论文中提出的模型可生成22个关键点,其中21个点是人手部的,第22个点代表着背景。下图展示了人手部的21个关键点位置。
OpenCV手部关键点检测(手势识别)代码示例

OpenCV手部关键点检测主要流程
1)下载模型
运行开源工程中的getModels.sh下载模型,
OpenCV手部关键点检测(手势识别)代码示例 或者直接在网址:
http://posefs1.perception.cs.cmu.edu/OpenPose/models/hand/pose\_iter\_102000.caffemodel
下载。将模型放到“hand/”文件夹下。
2)加载模型和图像
使用OpenCV DNN函数readNetFromCaffe函数加载模型权重。
OpenCV手部关键点检测(手势识别)代码示例 3)推断预测
blobFromImage将图像转为blob,forward函数实现网络推断。
OpenCV手部关键点检测(手势识别)代码示例 4)获取关键点精确位置并显示

OpenCV手部关键点检测(手势识别)代码示例

OpenCV手部关键点检测(手势识别)代码示例

上述网络计算的结果是22个矩阵,每个矩阵代表某个特定关键点最可能出现在图像中哪个位置的热图,需要调用minmaxLoc函数找到精确位置,进而将其画出并标注序号。
OpenCV手部关键点检测(手势识别)代码示例

OpenCV手部关键点检测(手势识别)代码示例

OpenCV手部关键点检测(手势识别)代码示例

5)画出骨架
OpenCV手部关键点检测(手势识别)代码示例

OpenCV手部关键点检测(手势识别)代码示例

OpenCV手部关键点检测(手势识别)代码示例

视频效果:

从视频中可以看出关键点有抖动,且有部分帧出现关键点跳变,如何让其更稳定呢?

在该博文评论区,某大佬提出使用Savgol滤波器对数据进行平滑可以得到较满意的结果。
看看效果如何:

是不是立刻感觉好了很多?

关键点平滑代码:
https://stackoverflow.com/questions/52450681/how-can-i-use-smoothing-techniques-to-remove-jitter-in-pose-estimation/

原博文地址:
https://www.learnopencv.com/hand-keypoint-detection-using-deep-learning-and-opencv/
代码地址:
https://github.com/spmallick/learnopencv/tree/master/HandPose


长按关注我爱计算机视觉

OpenCV手部关键点检测(手势识别)代码示例

【点赞与转发】就是一种鼓励

本文分享自微信公众号 - 我爱计算机视觉(aicvml)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这