opencv-python手势识别完整代码
时间: 2023-07-26 20:30:12 浏览: 192
以下是一个利用 OpenCV-Python 实现手势识别的完整代码示例。代码基于 Python 3.6 和 OpenCV 4.5.1 版本:
```python
import cv2
import numpy as np
import math
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读入摄像头的图像
ret, frame = cap.read()
# 获取图像的宽度和高度
height, width, channels = frame.shape
# 将图像转换为 HSV 颜色空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 定义颜色范围
lower_skin = np.array([0, 20, 70], dtype=np.uint8)
upper_skin = np.array([20, 255, 255], dtype=np.uint8)
# 提取皮肤颜色区域
mask = cv2.inRange(hsv, lower_skin, upper_skin)
# 进行图像处理,包括腐蚀和膨胀
kernel = np.ones((3, 3), np.uint8)
mask = cv2.erode(mask, kernel, iterations=1)
mask = cv2.dilate(mask, kernel, iterations=1)
# 找到手的轮廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 使用最大轮廓来表示手
max_contour = max(contours, key=lambda x: cv2.contourArea(x))
# 计算手的凸包
hull = cv2.convexHull(max_contour)
# 绘制手的轮廓和凸包
cv2.drawContours(frame, [max_contour], -1, (0, 255, 255), 2)
cv2.drawContours(frame, [hull], -1, (0, 0, 255), 3)
# 计算凸包的缺陷
defects = cv2.convexityDefects(max_contour, cv2.convexHull(max_contour, returnPoints=False))
# 如果存在凸包的缺陷
if defects is not None:
for i in range(defects.shape[0]):
# 获取缺陷的四个点
s, e, f, d = defects[i, 0]
# 获取缺陷的起点、终点和中点
start = tuple(max_contour[s][0])
end = tuple(max_contour[e][0])
far = tuple(max_contour[f][0])
# 计算缺陷的角度
a = math.sqrt((end[0] - start[0]) ** 2 + (end[1] - start[1]) ** 2)
b = math.sqrt((far[0] - start[0]) ** 2 + (far[1] - start[1]) ** 2)
c = math.sqrt((end[0] - far[0]) ** 2 + (end[1] - far[1]) ** 2)
angle = math.acos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c)) * 180 / math.pi
# 如果角度小于 90 度,则表示出现了手势
if angle < 90:
cv2.circle(frame, far, 5, (0, 0, 255), -1)
# 显示图像
cv2.imshow('frame', frame)
# 按下 q 键退出程序
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头
cap.release()
# 关闭窗口
cv2.destroyAllWindows()
```
该代码实现了以下功能:
1. 打开摄像头,读取摄像头中的图像。
2. 将图像转换为 HSV 颜色空间,并提取皮肤颜色区域。
3. 对提取的皮肤颜色区域进行图像处理,包括腐蚀和膨胀。
4. 找到手的轮廓,并使用最大轮廓来表示手。
5. 计算手的凸包,并绘制手的轮廓和凸包。
6. 计算凸包的缺陷,并根据缺陷的角度来判断手势是否出现。
7. 显示图像,并等待用户按下 q 键退出程序。
需要注意的是,该代码仅对单个手进行识别,如果需要识别多个手或者进行更复杂的手势识别,则需要进行进一步的改进。
阅读全文