import cv2
# 手势识别函数
def reg(x):
#=================找出轮廓===============
#查找所有轮廓
x=cv2.cvtColor(x,cv2.COLOR_BGR2GRAY)
contours,h = cv2.findContours(x,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#从所有轮廓中找到最大的,作为手势的轮廓
cnt = max(contours,key=lambda x:cv2.contourArea(x))
areacnt = cv2.contourArea(cnt) #获取轮廓面积
#===========获取轮廓的凸包=============
hull = cv2.convexHull(cnt) #获取轮廓的凸包,用于计算面积,返回坐标
areahull = cv2.contourArea(hull) #获取凸包的面积
#===========获取轮廓面积、凸包面积,二者的比值=============
arearatio = areacnt/areahull
#通常情况下,手势0,轮廓和凸包大致相等,该值大于0.9.
# 手势1,轮廓要比凸包小一些,该值小于等于0.9
# 需要注意,这个不是特定值,因人而异,有的人手指长,有的人手指短
# 所以,该值存在一定的差异
if arearatio>0.8: #轮廓面积/凸包面积>0.9,二者面积近似,识别为0
result='fist:0'
else:
result='finger:1' #对应:轮廓面积/凸包面积<=0.9,较大凸缺陷,识别为1
return result
# 读取两幅图像识别
x = cv2.imread('zero.jpg')
y = cv2.imread('one.jpg')
# 分别识别x和y
xtext=reg(x)
ytext=reg(y)
# 输出识别结果
org=(0,80)
font = cv2.FONT_HERSHEY_SIMPLEX
fontScale=2
color=(0,0,255)
thickness=3
cv2.putText(x,xtext,org,font,fontScale,color,thickness)
cv2.putText(y,ytext,org,font,fontScale,color,thickness)
# 显示识别结果
cv2.imshow('zero',x)
cv2.imshow('one',y)
cv2.waitKey()
cv2.destroyAllWindows()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
结果