书名:计算机视觉40例从入门到深度学习:OpenCV-Python
作者:李立宗
出版社:电子工业出版社
出版时间:2022-07-01
ISBN:9787121436857
一、手势识别
-
手势识别的范围很广泛,在不同场景下,有不同类型的手势需要识别,例如:
● 识别手势所表示的数值。
● 识别手势在特定游戏中的含义,如“石头、剪刀、布”等。
● 识别手势在游戏中表示的动作,如前进、跳跃、后退等。
● 识别特定手势的含义,如表示“OK”的手势、表示胜利的手势等。 -
手势在表示0~5六个数值时的识别问题。
在识别时,将手势图中凹陷区域(称为凸缺陷)的个数作为识别的重要依据。手势表示数值的示意图如图8-1所示
图8-1 手势表示数值的示意图- 在对表示数值的手势进行识别时,直接计算其中的凸缺陷个数即可识别数值2到数值5。
- 但是,在凸缺陷个数为0时,无法通过识别凸缺陷个数识别手势表示的数值,需要进一步处理。此时,需要应用到凸包的概念。
- 另外,在处理凸缺陷时,我们仅考虑了比较明显的区域。实际上,在通过算法获取凸缺陷的同时,会获取到很多细小的凸缺陷,因此还需要将这些细小的凸缺陷屏蔽。
二、理论基础
1、获取凸包
-
逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。
凸包和逼近多边形很像,只不过凸包是物体最外层的凸多边形。
凸包指的是完全包含原有轮廓,并且仅由轮廓上的点构成的多边形。
凸包的每一处都是凸的,即连接凸包内任意两点的直线都在凸包内部。
在凸包内,任意连续三个点构成的面向内部的角的角度都小于180°。 -
凸包示意图如图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()
运行结果
网友评论