Termux 调用摄像头运行YOLO完整方案

[复制链接]
145|10
# 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桌面环境。

飞思啦 发表于 2026-7-12 09:27 | 显示全部楼层
用python跑的吗,我看好多都开始用C++入手了
AloneKaven 发表于 2026-7-12 09:54 | 显示全部楼层
用C++跑可以加速,试试用OpenCV的C++接口结合NCNN,效果应该会好。
 楼主| 中国英茂科工 发表于 2026-7-13 09:56 | 显示全部楼层
飞思啦 发表于 2026-7-12 09:27
用python跑的吗,我看好多都开始用C++入手了

 楼主| 中国英茂科工 发表于 2026-7-13 09:57 | 显示全部楼层
AloneKaven 发表于 2026-7-12 09:54
用C++跑可以加速,试试用OpenCV的C++接口结合NCNN,效果应该会好。

MessageRing 发表于 2026-7-13 15:18 | 显示全部楼层
YOLO用Python跑是挺方便的,不过确实C++可以加速。你试试用OpenCV的C++接口结合NCNN,对摄像头性能要求更高,效果应该不错。
 楼主| 中国英茂科工 发表于 2026-7-14 05:50 | 显示全部楼层
MessageRing 发表于 2026-7-13 15:18
YOLO用Python跑是挺方便的,不过确实C++可以加速。你试试用OpenCV的C++接口结合NCNN,对摄像头性能要求更高 ...

理论上可行,之前做过失败了,非软件自建个人WIFI视觉系统,应用场景----定点hack之眼
狄克爱老虎油 发表于 2026-7-14 11:15 | 显示全部楼层
方案2确实不错,但要注意调整NCNN的配置,优化模型参数,提高检测速度。我之前用C++结合NCNN加速YOLO,效果不错。
 楼主| 中国英茂科工 发表于 2026-7-15 09:41 | 显示全部楼层
狄克爱老虎油 发表于 2026-7-14 11:15
方案2确实不错,但要注意调整NCNN的配置,优化模型参数,提高检测速度。我之前用C++结合NCNN加速YOLO,效果 ...

看看源码呗,我的本意是手机机器识别,联网远程识别
Henryko 发表于 2026-7-15 14:27 | 显示全部楼层
试试优化Termux的内存配置,可能会提高性能。还可以调整NCNN的CPU线程数,比如设置`max_threads=4`。
EmmaTT 发表于 2026-7-16 13:02 | 显示全部楼层
方案2确实好,用OpenCV的C++接口结合NCNN加速,记得优化模型参数和调整CPU线程数,我之前这么做加速明显。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

523

主题

1458

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0