大家好,我是一名本科生,我的主要学习方向是计算机视觉以及人工智能。按照目前的学习进度来说,我就是一小白,在这里写下自己编写的程序,与大家分享,记录一下自己的成长。
今天与大家分享的是基于OpenCv的手势识别。
思路分析
获取图片,在图片中找到手,然后进行一系列的闭运算,降噪平滑处理,轮廓查找,凸缺陷检测。(如果你不太理解这些操作,别着急在下面的源码中我会尝试着解释)
然后根据凸包缺陷的个数来判断手指的个数。
遇到的困难
在上述的过程借助opencv库很容易就可以实现,但实现的过程中令人头疼的地方。
在图像中找出手部是很麻烦的,一开始按照书上的方法是将读入的图片由BGR转换为HSV模式,由HSV来确定手的肤色范围,将手从图像中分离出来,代码如下:
//设置肤色范围,该范围的数值是百度出来的人体肤色范围
lower_skin = np.array([0,28,70],dtype = np.uint8)
upper_skin = np.array([20,255,255],dtype = np.uint8)
//根据肤色范围进行手的查找,
//cv2.inRange函数会将图像内不在该范围区域设置为黑色
mask = cv2.inRange(img_hsv,lower_skin,upper_skin)
//但是该方法的效果不理想,找出的手部不准确
我又在网上查找一番,找到了比HSV好的方法:椭圆肤色检测
//这里我写成了一个类
class check_skin():
def __init__(self):
// 创建椭圆模型
self.ellipse_mode = np.zeros((256, 256), dtype=np.uint8)
/// 在图像上绘制白色椭圆
cv2.ellipse(self.ellipse_mode, (113, 155), (23, 15), 43, 0, 360, (255, 255, 255), -1)
def check_finger(self,path):
img = cv2.imread(path, cv2.IMREAD_COLOR)
// 图像皮肤掩膜创建
skin_mask = np.zeros(img.shape[:2], dtype=np.uint8)
// 将图像转换为YCBCR
img_ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
cr = img_ycrcb