Files
sight-identification/README.md
2026-01-07 16:42:22 +08:00

219 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 自动拍照与情绪分析应用Flutter
这是一个使用 **Flutter** 开发的跨平台应用,主要面向 **Android**,同时兼容 **Web / Windows / macOS / Linux**
核心功能是:自动拍照、保存到相册,并使用 YOLO 模型对照片进行物体/情绪分析,最终在结果页展示分析信息。
---
### 功能概览
- **欢迎页**
- 显示应用简介
- 「开始拍摄」按钮,进入相机/图片选择流程
- **自动拍照移动端Android / iOS**
- 使用 `camera` 插件打开系统摄像头
- 点击「开始拍摄」后,每 **2 秒** 自动拍一张照片
- 点击「停止」后结束连续拍摄
- 每张照片都会:
- 保存到本地相册(使用 `gal`
- 调用 YOLO 分析服务进行识别
- **图片选择Web / 桌面端)**
- 由于 `camera` 插件在 Web/桌面支持有限,这些平台使用 `image_picker`
- 用户通过弹出的系统对话框选择/拍摄图片
- 选中的图片同样会走保存与 YOLO 分析流程
- **结果页**
- 按列表展示每张照片及其对应的 YOLO 分析结果
- 显示检测到的对象标签及置信度
- 有「完成」按钮,一键返回欢迎页
---
### 技术栈与主要依赖
- **框架**
- Flutter推荐 Flutter 3.x 及以上)
- **核心插件**
- `camera`:移动端相机预览与拍照
- `image_picker`Web / 桌面端选择或拍摄图片
- `gal`:将图片保存到系统相册(移动端)
- `permission_handler`:相机 / 媒体库权限管理
- `path_provider` / `path`:文件系统与路径处理
- `http`:向 YOLO 推理服务发起 HTTP 请求
---
### 目录结构(简化)
```text
view-app/
├── lib/
│ ├── main.dart # 应用入口,配置路由和主题
│ ├── screens/
│ │ ├── welcome_screen.dart # 欢迎页
│ │ ├── camera_screen.dart # 相机 / 图片选择页面(平台区分逻辑)
│ │ └── result_screen.dart # 分析结果展示页面
│ └── services/
│ └── yolo_service.dart # YOLO 推理服务封装(含模拟数据)
├── android/ # Android 原生工程
├── ios/ # iOS 原生工程
├── web/ # Web 配置与静态资源
├── windows/ / macos/ / linux/ # 各桌面平台工程
├── pubspec.yaml # Flutter 依赖配置
└── README.md
```
---
### 开发环境要求
- Flutter SDK建议3.x 或更高)
- JDK 17已针对 Gradle / AGP 配置为 Java 17
- Android SDKAPI 35 及以上,编译使用 `compileSdk 36`
- 一台 Android 真机或模拟器(用于运行移动端)
可通过以下命令检查环境:
```bash
flutter doctor
```
---
### 安装依赖
在项目根目录执行:
```bash
flutter pub get
```
如果你需要使用 `lib/backend_model` 目录中的 Node 后端(例如承载真实 YOLO 服务或中转服务),需要单独安装该子项目的依赖:
```bash
cd lib/backend_model
npm install
```
---
### backend_modelNode 后端)环境与启动
`lib/backend_model` 是一个简单的 Node.js 后端示例,基于 **Express**,入口文件为 `index.js`,在 `package.json` 中定义了标准的 `start` 脚本。
#### 环境要求
- Node.js建议 18.x 或 20.x
- npm随 Node 一起安装)
#### 安装依赖
```bash
cd lib/backend_model
npm install
```
#### 启动后端服务
```bash
cd lib/backend_model
npm start
```
默认会以 `node index.js` 的方式启动服务(具体端口和路由逻辑请查看 `lib/backend_model/index.js`)。
如果你打算让 Flutter 端的 `YoloService` 调用这个后端,请将 `lib/services/yolo_service.dart` 中的 `yoloApiUrl` 修改为该服务实际监听的地址,例如:
```dart
static const String yoloApiUrl = 'http://192.168.0.100:3000/api/detect';
```
---
### 运行项目
#### Android / iOS
1. 连接真机或启动模拟器
2. 在项目根目录执行:
```bash
flutter run
```
如有多设备,可以指定设备 ID例如
```bash
flutter run -d "ALA AN70"
```
#### Web
```bash
flutter run -d chrome
```
#### Windows / macOS / Linux
```bash
flutter run -d windows # 或 macos / linux
```
---
### 权限说明(移动端)
应用在 Android 上会请求以下权限:
- 相机权限:`CAMERA`
- 读取存储/媒体:
- Android 12 及以下:`READ_EXTERNAL_STORAGE`, `WRITE_EXTERNAL_STORAGE`
- Android 13+`READ_MEDIA_IMAGES`
这些权限会在第一次使用相关功能时弹出请求。
---
### YOLO 服务配置
YOLO 调用逻辑封装在 `lib/services/yolo_service.dart` 中:
- 默认使用 **模拟数据**:如果 `YoloService.yoloApiUrl` 保持为占位地址(如 `http://your-yolo-api-url/api/detect`),则不会真实发起网络请求,而是返回随机模拟结果,方便本地开发和调试。
- 如需接入真实 YOLO 推理服务:
1.`yolo_service.dart` 中将 `yoloApiUrl` 修改为你的服务地址;
2. 确认服务支持 `multipart/form-data` POST字段名为 `image`
3. 根据你的返回 JSON 结构,必要时调整 `YOLOAnalysisResult.fromJson``DetectedObject.fromJson` 的解析逻辑。
---
### 常见问题
- **构建失败Gradle / AGP / Java 版本相关)**
- 本项目已升级至:
- Gradle Wrapper8.11.1
- Android Gradle Plugin8.9.1
- Kotlin2.1.0
- Java17
- 若本地 JDK 版本不一致,请确认 `JAVA_HOME` 指向 JDK 17并重新执行
```bash
cd android
.\gradlew clean
```
- **相机不可用 / 权限被拒绝**
- 请在系统设置中检查本应用是否已被授予相机和照片/媒体库权限。
- **Web/桌面端没有自动连续拍照**
- 这是预期行为:当前实现是 **移动端自动连续拍照**Web/桌面使用 **交互式选择图片**`image_picker`),以适配平台限制。
---
### 许可证与贡献
- 许可证MIT License
- 欢迎提交 Issue / Pull Request 来改进自动拍照、YOLO 识别效果或多平台体验。