【DigiKey“智造万物,快乐不停”创意大赛】汇总:机器视觉打造全自动老板键智能键盘
[复制链接]
本帖最后由 eew_dy9f48 于 2024-1-5 08:23 编辑
汇总一下每个步骤的实现帖子:
【DigiKey“智造万物,快乐不停”创意大赛】1,ESP32S2摄像头开发板设计
【DigiKey“智造万物,快乐不停”创意大赛】2,Pi400 HID 键盘功能的实现
【DigiKey“智造万物,快乐不停”创意大赛】3,Pi400 键盘动作的捕捉与独占
【DigiKey“智造万物,快乐不停”创意大赛】4,人脸识别在Pi400上的实现。
最后我们只需要整合上述功能,就可以实现带有全自动老板键的智能键盘。
完整主程序代码如下:
- ···
-
- import zero_hid
-
- import evdev
-
- import csv
-
- import signal
-
- import os
-
- import threading
-
-
-
- if os.geteuid() != 0:
-
- raise ImportError('You must be root to use this library on linux.')
-
-
-
- k = zero_hid.Keyboard()
-
-
-
- dev = evdev.InputDevice('/dev/input/event0')
-
- dev.grab()
-
-
-
- with open('./codemap.csv', 'r') as file:
-
- reader = csv.reader(file)
-
- codemap = {rows[0]:rows[1] for rows in reader}
-
- del codemap[""]
-
-
-
- curr_pressed = []
-
- def key_input(key):
-
- global curr_pressed
-
- if isinstance(key, evdev.KeyEvent) and key.keystate != 2:
-
- if key.keystate == 1:
-
- curr_pressed.append(key.keycode)
-
- if key.keystate == 0:
-
- curr_pressed.remove(key.keycode)
-
- print("\r" + "CODE: " + key.keycode + " ;STAT: " + str(key.keystate) + " "*40, end="")
-
- keys = [codemap[i] for i in curr_pressed]
-
- k.press(keys, additive=False, hold=True)
-
-
-
- def handler(signal, frame):
-
- k.release_all()
-
- dev.ungrab()
-
- dev.close()
-
- exit()
-
-
-
- signal.signal(signal.SIGTSTP, handler)
-
- signal.signal(signal.SIGINT, handler)
-
-
-
- def thread1():
-
- for event in dev.read_loop():
-
- try:
-
- key_input(evdev.categorize(event))
-
- except Exception as error:
-
- print(error)
-
-
-
- t1 = threading.Thread(target=thread1, daemon=True)
-
- t1.start()
-
-
-
-
-
- from ultralytics import YOLO
-
- import requests
-
- url = "http://192.168.8.171"
-
- model = YOLO("yolov8n.pt")
-
- requests.get(url+"/control?var=framesize&val=" + str(8))
-
- results = model.predict(url+":81/stream", stream=True, show=True, conf = 0.5)
-
- delay = 1
-
- count = 0
-
- mode = 0
-
- pre_mode = 0
-
-
-
- for result in results:
-
- try:
-
- for box in result.boxes:
-
- class_id = result.names[box.cls[0].item()]
-
- cords = box.xyxy[0].tolist()
-
- cords = [round(x) for x in cords]
-
- conf = round(box.conf[0].item(), 2)
-
- print("Object type:", class_id)
-
- print("Coordinates:", cords)
-
- print("Probability:", conf)
-
- print("---")
-
- if class_id == "person":
-
- mode = 1
-
- count = 0
-
- if mode != pre_mode:
-
- pre_mode = mode
-
- k.press(["MOD_LEFT_ALT","KEY_TAB"], additive=False, hold=False)
-
- print("triggered!!!")
-
- count += 1
-
- if count > delay:
-
- mode = 0
-
- pre_mode = mode
-
- except Exception as error:
-
- print(error)
-
- ···
项目源码:https://download.eeworld.com.cn/detail/eew_dy9f48/630641
|