前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >体感游戏 | 手势识别玩飞机大战游戏(二) Python+OpenCV实现简易手势识别功能

体感游戏 | 手势识别玩飞机大战游戏(二) Python+OpenCV实现简易手势识别功能

作者头像
Color Space
发布2021-01-08 15:12:05
2.3K0
发布2021-01-08 15:12:05
举报
文章被收录于专栏:OpenCV与AI深度学习
后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是:

今天是第二部分:Python+OpenCV实现简易手势识别功能。简易的手势识别,所以功能也很简单,识别手势1~5就行,当然我们控制飞机时只需要用到最多3个手势:发射子弹、向左移动和向右移动。所以1~5够用了,当然你也可以用手势的移动方向来控制飞机的移动方向,只需要计算手势轮廓的重心位置变化即可。

手势识别的实现步骤也比较简单,分以下三个步骤:

  1. HSV提取包含手势区域轮廓
  2. 计算轮廓多边形逼近和凸包缺陷
  3. 通过凸包缺陷距离来判断手指缝数量来计算手势

(1) HSV提取肤色轮廓,然后筛选找出手部轮廓

代码语言:javascript
复制
hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_hsv_1 = np.array([0,50,50])#颜色范围低阈值
upper_hsv_1 = np.array([20,255,255])#颜色范围高阈值
lower_hsv_2 = np.array([150,50,50])#颜色范围低阈值
upper_hsv_2 = np.array([180,255,255])#颜色范围高阈值
mask1 = cv2.inRange(hsv_img,lower_hsv_1,upper_hsv_1)
mask2 = cv2.inRange(hsv_img,lower_hsv_2,upper_hsv_2)
mask = mask1 + mask2
mask = cv2.medianBlur(mask,5)
k1=np.ones((5,5), np.uint8)
mask = cv2.dilate(mask, k1, iterations=1)
mask = cv2.erode(mask, k1, iterations=1)
mask_color = cv2.cvtColor(mask,cv2.COLOR_GRAY2BGR)
cv2.imshow("mask", mask)
#cv2.imwrite("mask.png", mask)
black_img = np.zeros(mask.shape,np.uint8)

contours,hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
if len(contours) < 1:
    return 0, img
      
contours.sort(key = cnt_area, reverse=True)  
(x0, y0, w0, h0) = cv2.boundingRect(contours[0])
if(w0>=100 and h0>=100):
    cv2.rectangle(img,(x0,y0),(x0+w0,y0+h0),(255,0,255),2)

(2) 多边形逼近和轮廓凸包缺陷计算

代码语言:javascript
复制
epsilon = 0.01 * cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0],epsilon,True)
cv2.drawContours(black_img,[approx],-1,(255,0,255),2)

contours2,hierarchy2 = cv2.findContours(black_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
if len(contours) < 1:
  return 0, img
hull = cv2.convexHull(contours2[0],returnPoints=False)
defects = cv2.convexityDefects(contours2[0],hull)

(3) 凸包缺陷距离筛选来计算手势数字

代码语言:javascript
复制
if d >= 13000:
      cv2.line(img,start,end,[0,255,0],3)#凸包
      cv2.circle(img,start,10,[0,255,255],3)
      cv2.circle(img,end,10,[0,255,255],3)
      cv2.circle(img,far,10,[0,0,255],3)#凸包缺陷点
      pre_start = start
      pre_end = end
      pointNum += 1
        
cv2.putText(img,'hand-%d'%pointNum,(10,35),font,1.2,(0,255,255),3)       
return pointNum, img 

视频效果:

源码请在公众号回复"手势识别"即可获取,更多视觉学习资讯请关注:OpenCV与AI深度学习,感谢支持!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档