后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是:
今天是第二部分:Python+OpenCV实现简易手势识别功能。简易的手势识别,所以功能也很简单,识别手势1~5就行,当然我们控制飞机时只需要用到最多3个手势:发射子弹、向左移动和向右移动。所以1~5够用了,当然你也可以用手势的移动方向来控制飞机的移动方向,只需要计算手势轮廓的重心位置变化即可。
手势识别的实现步骤也比较简单,分以下三个步骤:
-
HSV提取包含手势区域轮廓
-
计算轮廓多边形逼近和凸包缺陷
-
通过凸包缺陷距离来判断手指缝数量来计算手势
(1) HSV提取肤色轮廓,然后筛选找出手部轮廓
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) 多边形逼近和轮廓凸包缺陷计算
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) 凸包缺陷距离筛选来计算手势数字
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
视频效果:
https://www.bilibili.com/video/BV1pV411t7Rq/
源码请在公众号回复"手势识别"即可获取,更多视觉学习资讯请关注:OpenCV与AI深度学习,感谢支持!
后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是: 使用Pygame实现简易飞机大战小游戏 使用Python+OpenCV实现简单手势识别 使用OpenCV实现手势识别玩飞机大战游戏 使用TensorFlow实现手势识别玩飞机大战游戏 今天是第二部分:Python+OpenCV实现简易手势识别功能。简易的手势识别,所以功能也很简单,识别手势1~5就行,当然我们控制飞机时只需要用到最多3个手势:发射子弹、向左移动和向右移动。所以1~5...
互联网改变了我们的生活,现在连打麻将都在网上打了。进几年发现身边的很多朋友都在网上
玩
一款四川麻将APP。平时没事的时候我也
玩
玩
,我是一个写了几年程序的码龙,突然有一天我有个想法我能不能用我的专业来解放我的双手,用深度学习图像识别来做一个,麻将类软件的识别器,来帮助自己自动打麻将,从此我就可以一边看电视一边嗑瓜子一边和别人
玩
麻将了。想想都舒服。
首先我们来分析一下这个里面的技术难点。
1. 如何实时获取屏幕的视频流。
2. 如何识别出屏幕中的某一张牌是什么。(难点中的难点)
3. 如何控制整个
游戏
...
早就该补的一个。。
首先是传送门https://github.com/brynn-code/gesture_recognition/blob/master/calculate_finger.py
然后是主要方法:(因为太懒直接截图好了)
筛除指尖的方法参考自某篇论文,对不起我实在找不到了,代码是自己
实现
的,整体步骤如下。
轮廓检测与凸包生成
我们将从视频序列中识别手势。为了从实时视频序列中识别这些手势,我们首先需要单独取出手部区域,以去除视频序列中所有不需要的部分。在分割手部区域之后,我们对视频序列中显示的手指进行计数,以基于手指计数来指示机器人。因此,可以使用2个简单的步骤解决整个问题
1.从视频序列中找到并分割手部区域。
2.从视频序列中分割的手区域计算手指的数量。
2、分割手区域
手势识别
的第一步显然是通过消除视频序列中所有其他不需要的部分来找到手部区域。起初这似乎令人恐惧。但是不用担心。使......
首先在此声明本文代码参考 博客:https://github.com/az666/
opencv
-game/blob/master/shitoujiandaobu.py
参考文献:https://blog.csdn.net/JohinieLi/article/details/81041276
https://blog.csdn.net/qq_31531635/...
Python
的
OpenCV
库和MediaPipe工具包是可以一起使用的,以
实现
手势识别
的
功能
。
首先,需要在
Python
中安装
OpenCV
库和MediaPipe工具包。可以使用pip命令来安装它们:
pip install
opencv
-
python
pip install mediapipe
安装完成后,就可以开始使用了。
首先,导入必要的库:
```
python
import cv2
import mediapipe as mp
接下来,创建一个MediaPipe的Hand对象和一个
OpenCV
的VideoCapture对象,用于读取摄像头输入:
```
python
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
cap = cv2.VideoCapture(0)
然后,使用一个循环来读取摄像头输入并进行
手势识别
:
```
python
while True:
ret, frame = cap.read()
if not ret:
break
frame_RGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = hands.process(frame_RGB)
if results.multi_handedness:
for hand_landmarks in results.multi_hand_landmarks:
# 在这里可以对hand_landmarks进行处理和识别手势的操作
cv2.imshow('Gesture Recognition', frame)
if cv2.waitKey(1) == ord('q'):
break
在循环中,首先将读取到的帧转换为RGB格式,然后使用Hands对象的process方法对该帧进行
手势识别
。得到的结果存储在results变量中。
在对每个检测到的手部进行循环处理时,可以使用hand_landmarks来获取该手的关键点坐标。可以根据这些关键点的位置和运动轨迹来
实现
手势的识别和分析。
最后,通过cv2.imshow方法显示图像,并使用cv2.waitKey方法等待用户操作。当用户按下"q"键时,循环终止,程序退出。
通过以上步骤,就可以使用
Python
的
OpenCV
库和MediaPipe工具包
实现
手势识别
的
功能
了。当然,实际的
手势识别
算法和操作需要根据具体需求进行进一步的开发和优化。
### 回答2:
Python
OpenCV
和MediaPipe结合使用可以
实现
手势识别
。首先,我们需要安装必要的库和工具,包括
Python
、
opencv
-
python
、mediapipe和其他依赖项。
然后,我们可以使用MediaPipe提供的HandTracking模块来检测手部的关键点。它使用机器学习模型来识别手势,并返回手部关键点的坐标。我们可以通过
OpenCV
的视频捕捉模块读取摄像头的实时图像。
接下来,我们通过应用MediaPipe的HandTracking模块获取手部关键点的坐标,并使用
OpenCV
将这些坐标绘制到图像上,以便我们可以实时看到手部的位置和动作。
完成这些基本的设置后,我们可以定义特定的手势,例如拇指和食指的指尖接触,作为一个简单的示例。我们可以通过检查特定的关键点之间的距离和角度来识别这种手势。如果关键点之间的距离较小并且角度较小,则我们可以确定手势是拇指和食指的指尖接触。
我们可以使用类似的方法来识别其他手势,比如手掌的张开和闭合,拳头的形成等等。我们可以定义一系列规则和阈值来确定特定手势的识别。
最后,我们可以根据检测到的手势执行特定的操作。例如,当识别到拇指和食指的指尖接触时,我们可以触发相机的快门,
实现
手势拍照。
总之,
Python
的
OpenCV
和MediaPipe结合使用可以
实现
手势识别
。我们可以利用MediaPipe的HandTracking模块检测手部关键点,并使用
OpenCV
实时绘制手势位置。通过定义特定手势的规则,我们可以识别各种手势并执行相应操作。