用Python写一个用yolov8实时识别屏幕中的人并产生包含识别目标的坐标的.txt文件再让鼠标移动到该位置,记得设置键盘快捷键运行和结束脚本
时间: 2025-03-25 12:04:04 浏览: 26
以下是基于YOLOv8实现实时屏幕中人体检测、记录坐标至文本文件以及控制鼠标的Python脚本。同时设置了键盘快捷键来启动和停止脚本。
---
### 示例代码
```python
import cv2
import numpy as np
import pyautogui
import keyboard
from ultralytics import YOLO
from time import sleep
# 初始化YOLOv8模型
model = YOLO('yolov8n.pt') # 加载预训练的YOLOv8模型
# 定义全局变量
is_running = False
output_file = "detections.txt"
def start_or_stop():
"""切换运行状态"""
global is_running
is_running = not is_running
if is_running:
print("开始实时检测...")
else:
print("停止实时检测...")
# 绑定键盘快捷键(例如F9用于开关)
keyboard.add_hotkey('f9', start_or_stop)
try:
while True:
if not is_running:
sleep(0.1) # 检测未开启时休眠减少CPU占用
continue
# 截屏并转换为numpy数组 (BGR格式)
screenshot = pyautogui.screenshot()
frame = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
# 进行目标检测
results = model(frame, conf=0.5, classes=[0]) # 设置置信度阈值及仅检测“人”(class_id=0)
with open(output_file, 'w') as f:
for r in results:
boxes = r.boxes.numpy() # 获取边界框信息
for box in boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0])
center_x, center_y = (x1 + x2) // 2, (y1 + y2) // 2
# 写入坐标到txt文件
f.write(f"{center_x}, {center_y}\n")
# 控制鼠标移动到中心点
pyautogui.moveTo(center_x, center_y, duration=0.1)
# 打印当前状态
print(f"检测到人类目标,当前位置已写入 {output_file}")
except KeyboardInterrupt:
print("\n用户终止程序!")
finally:
keyboard.unhook_all()
```
---
### 代码说明
1. **初始化YOLOv8**
- 使用 `ultralytics.YOLO` 类加载预训练模型 `'yolov8n.pt'`。
- 参数 `classes=[0]` 表示我们只想检测 “人”(COCO数据集中的 class id=0)。
2. **截取屏幕并处理**
- 使用 `pyautogui.screenshot()` 实现屏幕截图,并转化为 OpenCV 支持的 BGR 格式。
3. **目标检测与输出**
- 对每一帧截图进行预测 (`conf=0.5`) 并提取边界框信息。
- 计算每个边界框的中心坐标 `(center_x, center_y)`。
- 将检测到的所有人的中心坐标保存进 `.txt` 文件。
4. **鼠标控制**
- 使用 `pyautogui.moveTo(x, y, duration=0.1)` 移动鼠标到计算出的目标位置。
5. **键盘热键支持**
- 用户按下 `F9` 键即可启停检测功能。
- 当前状态由 `is_running` 全局变量管理。
6. **异常安全退出**
- 添加了 `KeyboardInterrupt` 异常捕捉以便优雅地关闭程序。
- 最终清除所有注册的按键事件以防残留干扰。
---
阅读全文
相关推荐


















