Python 如何使用pynput限制按键

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

我已经做了一个代码来刺激游戏使用人脸检测。我找到了脸的中心,在它移动时,我用pynput库按下键。该代码工作得非常好,但只要它检测到点的移动并多次按下键盘键,这只是一个小问题。我想将按下的键限制为1

'''

导入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