手势识别Python代码
时间: 2025-01-04 10:32:04 浏览: 39
### 手势识别 Python 示例代码
手势识别是一个复杂的领域,涉及到计算机视觉和机器学习等多个方面。下面提供了一个基于 OpenCV 的简单手势识别程序示例[^1]。
此代码会打开摄像头捕获视频流,并尝试检测手部区域:
```python
import cv2
import numpy as np
def main():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 创建一个矩形框来限定手的位置
roi = gray[100:300, 100:300]
cv2.rectangle(frame, (100, 100), (300, 300), (0, 255, 0), 0)
blur = cv2.GaussianBlur(roi, (35, 35), 0)
_, thresh1 = cv2.threshold(blur, 70, 255,
cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(thresh1.copy(), \
cv2.RETR_TREE, \
cv2.CHAIN_APPROX_NONE)
max_area = -1
ci = None
for i in range(len(contours)):
cnt = contours[i]
area = cv2.contourArea(cnt)
if(area > max_area):
max_area = area
ci = i
if ci is not None and max_area != -1:
cnt = contours[ci]
hull = cv2.convexHull(cnt)
drawing = np.zeros(frame.shape,np.uint8)
cv2.drawContours(drawing,[cnt],0,(0,255,0),0)
cv2.drawContours(drawing,[hull],0,(0,0,255),0)
hull = cv2.convexHull(cnt, returnPoints=False)
defects = cv2.convexityDefects(cnt,hull)
count_defects = 0
try:
for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[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)) * 57
if angle <= 90:
count_defects += 1
cv2.circle(drawing,far,1,[0,0,255],-1)
cv2.line(drawing,start,end,[0,255,0],2)
font = cv2.FONT_HERSHEY_SIMPLEX
if count_defects == 1:
cv2.putText(frame,'2',(11,450),font,2,(255,0,0),5,cv2.LINE_AA)
elif count_defects == 2:
str = "3"
cv2.putText(frame,str ,(10,450),font,2,(255,0,0),5,cv2.LINE_AA)
elif count_defects == 3:
cv2.putText(frame,"4",(10,450),font,2,(255,0,0),5,cv2.LINE_AA)
elif count_defects == 4:
cv2.putText(frame,"5",(10,450),font,2,(255,0,0),5,cv2.LINE_AA)
else:
cv2.putText(frame,"1",(10,450),font,2,(255,0,0),5,cv2.LINE_AA)
except AttributeError:
pass
all_image = np.hstack((drawing,frame))
cv2.imshow('Gesture',all_image)
k = cv2.waitKey(50) & 0xFF
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
```
这段代码实现了通过摄像头捕捉图像并对手指数量进行计数的功能。它利用了轮廓查找、凸包计算以及缺陷检测等技术来判断手指的数量,并显示相应的数字。
阅读全文
相关推荐


















