用OpenCV实现手势识别(python)

前言

上个学期申请了一个计算机视觉方向的大创项目,所以趁这个寒假学习一些基本知识。作为入门的实践项目我选择了用OpenCV(Python)来实现简单的手势识别。

准备工作

需要用到的库有:cv2,numpy,copy,math
以及一台有摄像头的电脑

步骤

1.定义摄像头,捕捉图像

  • a.设置摄像头的参数(尺寸,位置)
    b.从摄像头得到图片
    c.对图像进行双边滤波(目的是使图片平滑一些),并进行翻转(目的是成为镜像)
    d.截取下一个矩形区域,那个区域就是手势识别的区域(目的是避免去识别一些无关紧要的东西)
这个过程需要用到的api
  • cv2.VideoCapture() :得到一个相机
    camera.read() 从相机中读取到图像
    cv2.rectangle() 画一个矩形
    cv2.imshow() 展示图片
    cv2.bilateralFilter() 双边滤波
    cv2.flip() 翻转

2.去除背景,获得手部的轮廓

  • a.等待键盘输入,确定捕获背景
    这里是手动确定背景,也可以改成等待一段时间自动获取
    b.确定好背景后,我们可以通过一个算法在新图像中将背景剔除,得到前景,在这个项目里,就是我们的手
    c.然后对前景进行处理,先是转化为灰度图,然后进行高斯滤波去噪,最后进行二值化处理(就是非黑即白的图片)
这个过程需要用到的api
  • cv2.createBackgroundSubtractorMOG2(0,bgSubThreshold)得到一个背景模型
    bgModel.apply(frame,learningrate= ) frame是新获取的图像。这步是从新图片上获得一个前景掩膜(前景是白色的,背景为黑色)
    cv2.erode(fgmask,kernel,iterations=1) 腐蚀操作,卷积操作,去除噪声
    cv2.bitwise_and(frame,frame,mask=fgmask) 掩膜和新的图像相与
    白色是1,黑色是0。任何值与0相与为0,任何值与1相与不变。这样就可以把前景抠下来了
    cv2.cvtColor() 转成灰度图
    cv2.GaussianBlur() 高斯滤波
    cv2.threshold() 转成二值图

3.特征判断

得到手的二值图后就可以进行判断了。判断可以用简单的特征法,也可以用高级的深度学习方法。这里初学采用特征法。先是用api获取手部轮廓,获取凸包,凸包就是可以手部刚好包围起来的凸多边形(不知道这样说对不对)。为什么要得到凸包和轮廓呢,目的是借助它俩得到凹陷。通过记录凹陷,可以得到我们手指窝的个数,从而得到手指的个数。但不是所有凹陷都是手指窝,这个凹陷的夹角应该小于90度。通过余弦定理可以求出角度。

这个过程需要用到的api
  • cv2.findContours() 得到轮廓,注意返回参数的属性
    cv2.convexHull () 得到凸包,其实也就是一个点集
    cv2.drawContours() 画出轮廓
    cv2.convexityDefects() 得到凹陷
    math.sqrt() 求平方
    opencv把图像看成一个矩阵,每个元素的值是颜色(不知这样说对不对)
    反正要知道,opencv中对图像操作其实是在对矩阵操作,一定要能理解到这一点,用api时才会顺一点。

感想

这是我第一次接触opencv,一路磕磕碰碰,最终还完成了,很开心。感觉学习的难点在于知识点的缺乏诸如如何处理图像,需要用到哪些算法,哪些api。这些容易给人产生一种对未知的畏惧感和挫败感。感觉做一个小项目是克服这种畏惧最好的方式吧,推荐去模仿一个别人的demo,看懂后自己敲一遍出来,理解每一步都在做什么,查找每一个api的用法。完成后自然而然可以得到的成就感再反过来促进自己的进一步学习。
最后要感谢两个博主,通过他们的博客,我才能够完成这个项目。
他们的博客讲的很详细。
https://blog.csdn.net/qq_36089056/article/details/85345882
https://blog.csdn.net/torresaaa/article/details/88120947

最后

第一次写博客,感谢观看!需要源码的请留言

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页