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.

结果

24-06-23 识别手指头数字0和1_人工智能

24-06-23 识别手指头数字0和1_人工智能_02