Files
sight-identification/README.md

219 lines
6.0 KiB
Markdown
Raw Permalink Normal View History

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