pycharm摄像头手势画图代码
时间: 2023-07-05 18:27:28 浏览: 103
以下是使用PyCharm编写的基于摄像头手势画图的代码,需要安装OpenCV和numpy库:
```
import cv2
import numpy as np
# 定义一些全局变量
last_x, last_y = None, None
drawing = False
mode = True # True表示绘制矩形,False表示绘制曲线
ix, iy = -1, -1
# 定义回调函数,用于鼠标事件的处理
def draw(event, x, y, flags, param):
global last_x, last_y, drawing, mode, ix, iy
if event == cv2.EVENT_LBUTTONDOWN:
# 鼠标左键按下时,开始绘制
drawing = True
last_x, last_y = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
if mode:
# 绘制矩形
cv2.rectangle(img, (last_x, last_y), (x, y), (0, 255, 0), -1)
else:
# 绘制曲线
cv2.line(img, (last_x, last_y), (x, y), (0, 0, 255), 5)
last_x, last_y = x, y
elif event == cv2.EVENT_LBUTTONUP:
# 鼠标左键松开时,停止绘制
drawing = False
if mode:
cv2.rectangle(img, (last_x, last_y), (x, y), (0, 255, 0), -1)
else:
cv2.line(img, (last_x, last_y), (x, y), (0, 0, 255), 5)
elif event == cv2.EVENT_RBUTTONDOWN:
# 鼠标右键按下时,清空画布
img.fill(0)
elif event == cv2.EVENT_LBUTTONDBLCLK:
# 鼠标左键双击时,切换绘制模式
mode = not mode
if mode:
print("绘制矩形模式")
else:
print("绘制曲线模式")
cap = cv2.VideoCapture(0)
# 创建一个黑色背景的窗口
img = np.zeros((480, 640, 3), np.uint8)
# 绑定窗口和回调函数
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw)
while True:
ret, frame = cap.read()
frame = cv2.flip(frame, 1) # 左右翻转图像,使得左右手能够自然对应
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 设定蓝色的阈值
lower_blue = np.array([90, 50, 50])
upper_blue = np.array([130, 255, 255])
# 根据阈值构建掩模
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 对原图像和掩模进行位运算
res = cv2.bitwise_and(frame, frame, mask=mask)
# 将掩模转换为灰度图像,并进行二值化处理
gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)
# 查找轮廓,并绘制最大的轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) > 0:
max_contour = max(contours, key=cv2.contourArea)
cv2.drawContours(frame, [max_contour], 0, (0, 255, 0), 2)
# 获取最大轮廓的外接矩形
x, y, w, h = cv2.boundingRect(max_contour)
# 如果手势区域面积大于一定值,就认为手势有效
if w * h > 10000:
# 在黑色背景窗口上绘制图形
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), -1)
# 将黑色背景窗口和摄像头图像进行融合
dst = cv2.addWeighted(frame, 0.7, img, 0.3, 0)
# 显示图像
cv2.imshow('image', dst)
# 按下ESC键退出程序
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
```
运行程序后,可以在摄像头画面上进行手势绘图,按下鼠标左键开始绘制,按下鼠标右键清空画布,双击鼠标左键切换绘制模式(矩形或曲线)。程序还可以识别手势区域,只有手势区域面积大于一定值时才会绘制图形。
阅读全文