基于opencv的手势识别

本文介绍了作者作为计算机视觉和人工智能学习者,如何利用OpenCV进行手势识别。通过图像处理,包括肤色检测、轮廓查找和凸缺陷检测,来判断手指个数。在遇到手部识别困难时,作者探索了椭圆肤色检测方法,并讨论了凸包和凸缺陷的概念,用于识别手指。最后,提到了使用mediapipe库进行手势识别的后续文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,我是一名本科生,我的主要学习方向是计算机视觉以及人工智能。按照目前的学习进度来说,我就是一小白,在这里写下自己编写的程序,与大家分享,记录一下自己的成长。
在这里插入图片描述

今天与大家分享的是基于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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值