# Termux 调用摄像头运行YOLO完整方案
## 前置说明
Termux原生无安卓摄像头、GPU支持,分两种可行方案:
1. **方案1:Termux+OpenCV+安卓摄像头(原生Python YOLOv5/v8,CPU运行,慢)**
2. **方案2:Termux调用Android Camera2 API + NCNN轻量化YOLO(速度更快)**
## 一、环境安装(Termux)
### 1. 更新源
```bash
pkg update && pkg upgrade -y
pkg install python python-pip git opencv-python cmake gcc clang libjpeg-turbo libpng
```
### 2. 安装YOLO依赖
```bash
pip install ultralytics opencv-python pillow numpy torch --no-cache-dir
```
### 3. 安卓摄像头权限工具(关键)
Termux不能直接访问 `/dev/video0`,用 `termux-camera-api`
```bash
pkg install termux-api
# 手机必须安装配套APP:Termux:API(F-Droid下载,商店无)
```
## 二、核心代码:YOLOv8 实时读取手机摄像头检测
原理:通过`termux-camera-photo`循环抓拍图片,送入YOLO推理,输出检测画面文本/保存截图
```python
from ultralytics import YOLO
import cv2
import subprocess
import numpy as np
import time
import os
# 加载YOLO模型(自动下载yolov8n.pt轻量模型)
model = YOLO("yolov8n.pt")
# 临时图片缓存路径
tmp_img = "/data/data/com.termux/files/home/cam_tmp.jpg"
print("=== Termux YOLO 摄像头检测启动 ===")
print("按 Ctrl+C 退出程序")
try:
while True:
# 调用TermuxAPI抓拍手机摄像头画面
subprocess.run(
["termux-camera-photo", "-c", "0", tmp_img],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
# 读取抓拍图片
frame = cv2.imread(tmp_img)
if frame is None:
print("摄像头读取失败,重试...")
time.sleep(0.3)
continue
# YOLO推理检测
results = model(frame)
# 绘制检测框
for res in results:
img = res.plot()
# 保存带检测框结果图
cv2.imwrite("yolo_result.jpg", img)
# 打印检测目标
for box in results[0].boxes.cls:
cls_id = int(box)
cls_name = model.names[cls_id]
print(f"检测到: {cls_name}")
time.sleep(0.5) # 帧率控制,CPU性能差降低频率
except KeyboardInterrupt:
print("\n程序已退出")
# 删除临时文件
if os.path.exists(tmp_img):
os.remove(tmp_img)
```
## 三、运行步骤
1. 手机安装 **Termux:API**(仅F-Droid可下,谷歌商店下架)
2. 打开手机设置 → 应用 → Termux:API,授予**相机权限**
3. Termux后台执行API服务:
```bash
termux-api-start
```
4. 保存代码为 `cam_yolo.py`,运行:
```bash
python cam_yolo.py
```
5. 检测结果图保存到主目录 `yolo_result.jpg`
## 四、优化&问题解决
### 1. 卡顿严重解决
- 使用极小模型:`yolov8n.pt`,不要用s/m/l/x
- 延长sleep时间:`time.sleep(1)`
- 关闭绘图,只输出文本检测:删除`res.plot()`和`imwrite`
### 2. 报错 `termux-camera-photo: command not found`
```bash
pkg install termux-api
termux-api-start
```
### 3. 拍照黑屏/读取None
- 切换摄像头:`-c 1` 后置,`-c 0`前置
- 重启Termux:API,重新授予相机权限
## 五、进阶:NCNN-YOLO轻量化(更快,C++)
Python CPU速度极低,推荐NCNN部署YOLOv5-tiny:
1. 编译NCNN库
2. 转换YOLO模型为ncnn.bin
3. 调用`termux-camera-photo`做图像预处理推理
需要我给你NCNN轻量化YOLO可直接编译的完整C++代码吗?
## 补充:实时可视化限制
Termux无桌面窗口,**无法弹出实时摄像头画面**,只能两种查看方式:
1. 终端打印检测物体名称
2. 生成jpg图片,用手机相册查看带框检测图
如果需要实时窗口,只能搭配VNC+Termux桌面环境。
|
|