python手势识别的算法,用OpenCV实现手势识别(Python),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

最后

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

你可能感兴趣的:(python手势识别的算法)