这段时间刚好处于出差前的一个空档期,于是就想记录一下我的毕设项目----基于手势识别的服务App,简单说就是通过数字手势识别去完成一些小功能如速算和拨号。速算:即在屏幕上显示算式,在前置做出答案对应的数字手势进行识别,正确则切换下一题,拨号:在屏幕前做出相应数字手势,识别完成后即显示然后可切换到下一数字手势继续识别。
开发环境自然是Opencv+AndroidStudio,整体走的路线是图像处理+机器学习,所以说其识别率受背景影响还是很大的,在复杂类肤色背景下很蛋疼。之后如果有空闲时间打算用深度学习重新开发一边大概也是用tiny-yolov3+cnn,思路比较简单就看部署时会遇到什么坑了,目前项目包和Apk都会放出来的,GitHub地址:https://github.com/BackNumberC/GestureApp。
一、算法流程
上流程图先介绍单帧图片的识别算法,整体流程大概可分为4个阶段:
①视频流单帧预处理 MeanShift+YCrCb+Otsu+形态学操作
②手腕去除及凸点手指计数 距离变换+凸点
③手势轮廓二值图识别 HOG+SVM
整个阶段不涉及识别的算法可在AS直接调用Opencv编码实现,但有关SVM识别的内容需要先在VS训练Xml模型然后移植部署到AS进行调用(Opencv3.x有关SVM训练使用后面博客会有介绍)。
二、功能实现
速算和拨号功能都是基于视频流实现的,而识别单帧图像得到的结果存在极大的偶然性,我们无法确定自己摆出的数字手势什么时候是稳定可识别的,则需要重新设计识别逻辑,不以单次识别作为最终结果。(只需要借鉴算法思路的小伙伴这部分不用多看)
总结来说就是增加单次识别次数,选择占比最高的作为最终识别结果。但想让整个识别流程不卡顿得循环运行下去还是需要涉及到安卓开发当中的多线程,异步类及通讯机制。(本次设置总识别次数为10,单次识别间隔为400ms)
三、使用说明
具体的算法流程及训练代码会在后面分三篇细讲....项目放在GitHub上(希望能点个Star)....Apk安装包已上传到了百度网盘了直接扫码下载。但界面UI并只用于18:9,其他比例没有做适配...但功能使用没有问题可正常运行,先放界面图。
使用时背景尽量单一不与肤色类似,当然更不要反光,这样在图像预处理肤色分割阶段就有较好的效果,同样较完整的分割二值图也保证了更高的识别率(HOG+SVM训练集1000张)。希望能给一些在做视觉图像方面项目的小伙伴一些处理思路。其实之前为处理好肤色分割能适应更多背景,也想了很多方法如k-means聚类,分水岭等等,但效果都不是很理想反而适得其反。把处理流程拉长了反而一些简单的背景无法识别了....这块还是得深度学习才行。