Python 如何使用pynput限制按键
我已经做了一个代码来刺激游戏使用人脸检测。我找到了脸的中心,在它移动时,我用pynput库按下键。该代码工作得非常好,但只要它检测到点的移动并多次按下键盘键,这只是一个小问题。我想将按下的键限制为1 '''Python 如何使用pynput限制按键,python,opencv,computer-vision,face-detection,pynput,Python,Opencv,Computer Vision,Face Detection,Pynput,我已经做了一个代码来刺激游戏使用人脸检测。我找到了脸的中心,在它移动时,我用pynput库按下键。该代码工作得非常好,但只要它检测到点的移动并多次按下键盘键,这只是一个小问题。我想将按下的键限制为1 ''' 导入cv2 将numpy作为np导入 从pynput.keyboard导入键,控制器 导入时间 键盘=控制器() wc=cv2.视频捕获(0) 时间。睡眠(2) 对于范围(40)内的i: ret,img=wc.read() img=cv2.flip(img,1) imgGray=cv2.cv
导入cv2
将numpy作为np导入
从pynput.keyboard导入键,控制器
导入时间
键盘=控制器()
wc=cv2.视频捕获(0)
时间。睡眠(2)
对于范围(40)内的i:
ret,img=wc.read()
img=cv2.flip(img,1)
imgGray=cv2.cvt颜色(img,cv2.COLOR\u bgr2灰色)
faces=Facescade.detectMultiScale(imgGray,1.1,4)
对于面中的(x,y,w,h):
cv2.矩形(img,(x,y),(x+w,y+h),(255,0,0),2)
中心=[int((x+w+x)/2),int((y+h+y)/2]
faceCascade=cv2.CascadeClassifier('haarcascade\u frontalface\u default.xml'))
wc=cv2.视频捕获(0)
#阅读直到视频完成
而(wc.isopend()):
#逐帧捕获
ret,img=wc.read()
img=cv2.flip(img,1)
如果ret==True:
imgGray=cv2.cvt颜色(img,cv2.COLOR\u bgr2灰色)
faces=Facescade.detectMultiScale(imgGray,1.1,4)
对于面中的(x,y,w,h):
cv2.矩形(img,(x,y),(x+w,y+h),(255,0,0),2)
新中心=[int((x+w+x)/2),int((y+h+y)/2]
cv2.圆(img,(新中心[0],新中心[1]),0,(0,0255),5)
如果中心\u新[0]-中心[0]>100:
键盘。按(右键)
键盘。释放(右键)
打印('右')
如果中心\u新[0]-中心[0]<-100:
键盘。按(键。左)
键盘。释放(键。左)
打印('左')
如果中心\u新[1]-中心[1]<-100:
键盘。按(键。向上)
键盘释放(键向上)
打印(‘向上’)
如果中心\u新[1]-中心[1]>100:
键盘=控制器()
键盘。按(键。向下)
键盘。释放(键。向下)
打印(‘向下’)
#显示结果帧
cv2.imshow(“脸”,img)
#按键盘上的Q键退出
如果cv2.waitKey(1)&0xFF==ord('q'):
打破
#打破循环
其他:
打破
#完成所有操作后,释放视频捕获对象
wc.release()
#关闭所有帧
cv2.destroyAllWindows()
'''
我得到这种输出:
'''
向上的
向上的
向上的
向上的
向上的
向上的
向上的
正确的
正确的
正确的
正确的
正确的
正确的
正确的
正确的
正确的
向上的
向上的
向上的
向上的
向上
''定义一些主区域,面部应返回该区域以区分一次击键和另一次击键,并使用标志观察击键。这就是你要找的吗
keystroke_zone = 100
home_zone = keystroke_zone - 10 # or whatever smaller than
is_home = True
while(wc.isOpened()):
...
if is_home:
if centre_new[0] - centre[0] > keystroke_zone :
keyboard.press(Key.right)
keyboard.release(Key.right)
print('right')
is_home = False
if centre_new[0] - centre[0] < -keystroke_zone :
keyboard.press(Key.left)
keyboard.release(Key.left)
print('left')
is_home = False
if centre_new[1] - centre[1] < -keystroke_zone :
keyboard.press(Key.up)
keyboard.release(Key.up)
print('up')
is_home = False
if centre_new[1] - centre[1] > keystroke_zone :
keyboard = Controller()
keyboard.press(Key.down)
keyboard.release(Key.down)
print('down')
is_home = False
else:
if abs(centre_new[0] - centre[0]) < home_zone or\
abs(centre_new[1] - centre[1]) < home_zone:
is_home = True
击键区域=100
home_zone=击键_zone-10#或任何小于
这是真的吗
而(wc.isopend()):
...
如果你在家:
如果中央按钮新建[0]-中央按钮[0]>击键区域:
键盘。按(右键)
键盘。释放(右键)
打印('右')
是家还是假的
如果中心为新[0]-中心为[0]<-击键区域:
键盘。按(键。左)
键盘。释放(键。左)
打印('左')
是家还是假的
如果中心为新[1]-中心为[1]<-击键区域:
键盘。按(键。向上)
键盘释放(键向上)
打印(‘向上’)
是家还是假的
如果中心[1]-中心[1]>击键区域:
键盘=控制器()
键盘。按(键。向下)
键盘。释放(键。向下)
打印(‘向下’)
是家还是假的
其他:
如果abs(中心新[0]-中心[0])<主区域或\
abs(中心新[1]-中心[1])<主区:
这是真的吗
还请注意,如果ret:理解,将img=cv2.flip(img,1)
放在之后是有意义的。谢谢
keystroke_zone = 100
home_zone = keystroke_zone - 10 # or whatever smaller than
is_home = True
while(wc.isOpened()):
...
if is_home:
if centre_new[0] - centre[0] > keystroke_zone :
keyboard.press(Key.right)
keyboard.release(Key.right)
print('right')
is_home = False
if centre_new[0] - centre[0] < -keystroke_zone :
keyboard.press(Key.left)
keyboard.release(Key.left)
print('left')
is_home = False
if centre_new[1] - centre[1] < -keystroke_zone :
keyboard.press(Key.up)
keyboard.release(Key.up)
print('up')
is_home = False
if centre_new[1] - centre[1] > keystroke_zone :
keyboard = Controller()
keyboard.press(Key.down)
keyboard.release(Key.down)
print('down')
is_home = False
else:
if abs(centre_new[0] - centre[0]) < home_zone or\
abs(centre_new[1] - centre[1]) < home_zone:
is_home = True