美文网首页
手势识别理论基础(凸包)

手势识别理论基础(凸包)

作者: 大龙10 | 来源:发表于2023-10-06 13:12 被阅读0次

    书名:计算机视觉40例从入门到深度学习:OpenCV-Python
    作者:李立宗
    出版社:电子工业出版社
    出版时间:2022-07-01
    ISBN:9787121436857


    一、手势识别

    • 手势识别的范围很广泛,在不同场景下,有不同类型的手势需要识别,例如:
      ● 识别手势所表示的数值。
      ● 识别手势在特定游戏中的含义,如“石头、剪刀、布”等。
      ● 识别手势在游戏中表示的动作,如前进、跳跃、后退等。
      ● 识别特定手势的含义,如表示“OK”的手势、表示胜利的手势等。

    • 手势在表示0~5六个数值时的识别问题。
      在识别时,将手势图中凹陷区域(称为凸缺陷)的个数作为识别的重要依据。手势表示数值的示意图如图8-1所示


      图8-1 手势表示数值的示意图
      • 在对表示数值的手势进行识别时,直接计算其中的凸缺陷个数即可识别数值2到数值5。
      • 但是,在凸缺陷个数为0时,无法通过识别凸缺陷个数识别手势表示的数值,需要进一步处理。此时,需要应用到凸包的概念。
      • 另外,在处理凸缺陷时,我们仅考虑了比较明显的区域。实际上,在通过算法获取凸缺陷的同时,会获取到很多细小的凸缺陷,因此还需要将这些细小的凸缺陷屏蔽。

    二、理论基础

    1、获取凸包

    • 逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。
      凸包和逼近多边形很像,只不过凸包是物体最外层的凸多边形。
      凸包指的是完全包含原有轮廓,并且仅由轮廓上的点构成的多边形。
      凸包的每一处都是凸的,即连接凸包内任意两点的直线都在凸包内部。
      在凸包内,任意连续三个点构成的面向内部的角的角度都小于180°。

    • 凸包示意图如图8-2所示,图中最外层的多边形是机械手的凸包,通过它可以处理手势识别等问题。

    图8-2 凸包示意图
    • OpenCV提供的函数cv2.convexHull()用于获取轮廓的凸包


    其中,返回值hull为凸包角点。该函数中的参数如下:
    ● points表示轮廓。
    ● clockwise为布尔型值;在该值为True时,凸包角点按顺时针方向排列;在该值为False时,凸包角点按逆时针方向排列。
    ● returnPoints为布尔型值,默认值是True,此时,函数返回凸包角点的坐标值;当该参数为False时,函数返回轮廓中凸包角点的索引。

    三、程序

    import cv2
    # --------------读取并绘制原始图像------------------
    o = cv2.imread('d:\\hand.bmp')  
    cv2.imshow("original",o)
    
    # --------------提取轮廓------------------
    gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)  
    ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)  
    
    # --------------寻找凸包,得到凸包的角点------------------
    hull = cv2.convexHull(contours[0])
    # --------------绘制凸包------------------
    cv2.polylines(o, [hull], True, (0, 255, 0), 2)
    # --------------显示凸包------------------
    cv2.imshow("result",o)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    
    运行结果

    相关文章

      网友评论

          本文标题:手势识别理论基础(凸包)

          本文链接:https://www.haomeiwen.com/subject/cpvubdtx.html