update README.md
This commit is contained in:
50
.gitignore
vendored
50
.gitignore
vendored
@@ -38,51 +38,15 @@ app.*.symbols
|
||||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Android related
|
||||
/android/local.properties
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
|
||||
# iOS related
|
||||
**/ios/**/*.mode1v3
|
||||
**/ios/**/*.mode2v3
|
||||
**/ios/**/*.moved-aside
|
||||
**/ios/**/*.pbxuser
|
||||
**/ios/**/*.perspectivev3
|
||||
**/ios/**/*sync/
|
||||
**/ios/**/.sconsign.dblite
|
||||
**/ios/**/.tags*
|
||||
**/ios/**/.vagrant/
|
||||
**/ios/**/DerivedData/
|
||||
**/ios/**/Icon?
|
||||
**/ios/**/Pods/
|
||||
**/ios/**/.symlinks/
|
||||
**/ios/**/profile
|
||||
**/ios/**/xcuserdata
|
||||
**/ios/.generated/
|
||||
**/ios/Flutter/App.framework
|
||||
**/ios/Flutter/Flutter.framework
|
||||
**/ios/Flutter/Flutter.podspec
|
||||
**/ios/Flutter/Generated.xcconfig
|
||||
**/ios/Flutter/ephemeral
|
||||
**/ios/Flutter/app.flx
|
||||
**/ios/Flutter/app.zip
|
||||
**/ios/Flutter/flutter_assets/
|
||||
**/ios/Flutter/flutter_export_environment.sh
|
||||
**/ios/ServiceDefinitions.json
|
||||
**/ios/Runner/GeneratedPluginRegistrant.*
|
||||
# Node / backend related
|
||||
**/node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Web related
|
||||
/web/build/
|
||||
|
||||
# Coverage
|
||||
coverage/
|
||||
|
||||
# Exceptions to above rules.
|
||||
!**/ios/**/default.mode1v3
|
||||
!**/ios/**/default.mode2v3
|
||||
!**/ios/**/default.pbxuser
|
||||
!**/ios/**/default.perspectivev3
|
||||
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||
!/dev/ci/**/Gemfile.lock
|
||||
|
||||
384
README.md
384
README.md
@@ -1,280 +1,218 @@
|
||||
# 自动拍照与图像分析应用
|
||||
## 自动拍照与情绪分析应用(Flutter)
|
||||
|
||||
一个使用 Flutter 开发的跨平台应用,实现持续拍照和 YOLO 图像分析功能。
|
||||
这是一个使用 **Flutter** 开发的跨平台应用,主要面向 **Android**,同时兼容 **Web / Windows / macOS / Linux**。
|
||||
核心功能是:自动拍照、保存到相册,并使用 YOLO 模型对照片进行物体/情绪分析,最终在结果页展示分析信息。
|
||||
|
||||
## 功能特点
|
||||
---
|
||||
|
||||
- 📸 **持续拍照** - 点击开始后每2秒自动拍摄一张照片,直到点击停止按钮
|
||||
- 🖼️ **保存到相册** - 自动将拍摄的照片保存到设备相册
|
||||
- 🤖 **YOLO 图像分析** - 对拍摄的照片进行 YOLO 目标检测分析
|
||||
- 📊 **结果展示** - 在结果页面查看所有照片和分析结果
|
||||
- 🎨 **简洁界面** - 美观的欢迎界面、相机界面和结果展示界面
|
||||
- 📱 **跨平台支持** - 支持 Android、iOS、Web 和桌面平台
|
||||
### 功能概览
|
||||
|
||||
## 技术栈
|
||||
- **欢迎页**
|
||||
- 显示应用简介
|
||||
- 「开始拍摄」按钮,进入相机/图片选择流程
|
||||
|
||||
- **Flutter** - 跨平台UI框架
|
||||
- **camera** ^0.11.3 - 相机功能
|
||||
- **image_picker** ^1.0.7 - 图片选择(Web/桌面平台)
|
||||
- **gal** ^2.0.1 - 保存图片到相册
|
||||
- **permission_handler** ^12.0.1 - 权限管理
|
||||
- **http** ^1.1.0 - HTTP 请求(YOLO API 调用)
|
||||
- **path_provider** ^2.1.1 - 路径管理
|
||||
- **自动拍照(移动端:Android / iOS)**
|
||||
- 使用 `camera` 插件打开系统摄像头
|
||||
- 点击「开始拍摄」后,每 **2 秒** 自动拍一张照片
|
||||
- 点击「停止」后结束连续拍摄
|
||||
- 每张照片都会:
|
||||
- 保存到本地相册(使用 `gal`)
|
||||
- 调用 YOLO 分析服务进行识别
|
||||
|
||||
## 安装步骤
|
||||
- **图片选择(Web / 桌面端)**
|
||||
- 由于 `camera` 插件在 Web/桌面支持有限,这些平台使用 `image_picker`
|
||||
- 用户通过弹出的系统对话框选择/拍摄图片
|
||||
- 选中的图片同样会走保存与 YOLO 分析流程
|
||||
|
||||
### 前置要求
|
||||
- **结果页**
|
||||
- 按列表展示每张照片及其对应的 YOLO 分析结果
|
||||
- 显示检测到的对象标签及置信度
|
||||
- 有「完成」按钮,一键返回欢迎页
|
||||
|
||||
- Flutter SDK (>=3.0.0)
|
||||
- Dart SDK (>=3.0.0)
|
||||
- Android Studio 或 VS Code(推荐安装 Flutter 和 Dart 插件)
|
||||
- Android SDK(API Level 21+)
|
||||
- 一台 Android 设备或模拟器(推荐在真实设备上测试)
|
||||
---
|
||||
|
||||
### 1. 克隆项目
|
||||
### 技术栈与主要依赖
|
||||
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd view-app
|
||||
- **框架**
|
||||
- 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
|
||||
```
|
||||
|
||||
### 2. 安装依赖
|
||||
---
|
||||
|
||||
### 开发环境要求
|
||||
|
||||
- Flutter SDK(建议:3.x 或更高)
|
||||
- JDK 17(已针对 Gradle / AGP 配置为 Java 17)
|
||||
- Android SDK(API 35 及以上,编译使用 `compileSdk 36`)
|
||||
- 一台 Android 真机或模拟器(用于运行移动端)
|
||||
|
||||
可通过以下命令检查环境:
|
||||
|
||||
```bash
|
||||
flutter doctor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 安装依赖
|
||||
|
||||
在项目根目录执行:
|
||||
|
||||
```bash
|
||||
flutter pub get
|
||||
```
|
||||
|
||||
### 3. 运行应用
|
||||
如果你需要使用 `lib/backend_model` 目录中的 Node 后端(例如承载真实 YOLO 服务或中转服务),需要单独安装该子项目的依赖:
|
||||
|
||||
#### 在 Android 设备上运行(推荐)
|
||||
```bash
|
||||
cd lib/backend_model
|
||||
npm install
|
||||
```
|
||||
|
||||
1. 启用设备的 USB 调试
|
||||
2. 连接设备到电脑
|
||||
3. 运行:
|
||||
---
|
||||
|
||||
### backend_model(Node 后端)环境与启动
|
||||
|
||||
`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 devices # 查看可用设备
|
||||
flutter run -d "设备名称"
|
||||
flutter run -d "ALA AN70"
|
||||
```
|
||||
|
||||
#### 在 Android 模拟器上运行
|
||||
|
||||
1. 启动 Android 模拟器
|
||||
2. 运行:
|
||||
|
||||
```bash
|
||||
flutter run
|
||||
```
|
||||
|
||||
#### 在 Web 浏览器中运行
|
||||
#### Web
|
||||
|
||||
```bash
|
||||
flutter run -d chrome
|
||||
```
|
||||
|
||||
**注意**:Web 平台不支持自动连续拍照功能,需要使用 Android 或 iOS 设备。
|
||||
#### Windows / macOS / Linux
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
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/ # Windows 平台代码
|
||||
├── linux/ # Linux 平台代码
|
||||
├── macos/ # macOS 平台代码
|
||||
├── pubspec.yaml # 依赖配置
|
||||
└── README.md # 项目说明
|
||||
```bash
|
||||
flutter run -d windows # 或 macos / linux
|
||||
```
|
||||
|
||||
## 使用流程
|
||||
---
|
||||
|
||||
1. **启动应用**:打开应用,进入欢迎界面
|
||||
2. **开始拍照**:点击"开始拍照"按钮
|
||||
3. **授予权限**:首次使用会请求相机和存储权限,请允许
|
||||
4. **打开相机**:相机预览界面打开
|
||||
5. **开始拍摄**:点击"开始拍照"按钮,应用会每2秒自动拍摄一张照片
|
||||
6. **查看进度**:顶部显示已拍摄的照片数量
|
||||
7. **停止拍摄**:点击"停止拍照"按钮
|
||||
8. **图像分析**:应用自动对拍摄的照片进行 YOLO 分析(显示分析中对话框)
|
||||
9. **查看结果**:在结果页面查看所有照片和对应的分析结果
|
||||
10. **完成**:点击"完成"按钮返回欢迎界面
|
||||
### 权限说明(移动端)
|
||||
|
||||
## 功能说明
|
||||
应用在 Android 上会请求以下权限:
|
||||
|
||||
### 持续拍照
|
||||
|
||||
- 点击"开始拍照"后,应用会立即拍摄第一张照片
|
||||
- 然后每2秒自动拍摄一张,直到点击"停止拍照"按钮
|
||||
- 所有照片自动保存到设备相册(移动平台)或下载目录(Web/桌面平台)
|
||||
|
||||
### YOLO 图像分析
|
||||
|
||||
应用会对本次拍摄的所有照片进行 YOLO 目标检测分析:
|
||||
|
||||
1. **API 配置**:在 `lib/services/yolo_service.dart` 中配置 YOLO API 端点
|
||||
```dart
|
||||
static const String yoloApiUrl = 'http://your-yolo-api-url/api/detect';
|
||||
```
|
||||
|
||||
2. **API 格式**:
|
||||
- 请求:POST multipart/form-data,字段名为 `image`
|
||||
- 响应:JSON 格式,包含检测到的物体列表
|
||||
|
||||
3. **模拟数据**:如果 YOLO API 不可用,应用会使用模拟数据进行测试
|
||||
|
||||
### 结果展示
|
||||
|
||||
- 显示所有拍摄的照片
|
||||
- 每张照片下方显示对应的分析结果
|
||||
- 包括检测到的物体名称和置信度
|
||||
- 支持滚动查看所有结果
|
||||
|
||||
## 权限说明
|
||||
|
||||
应用需要以下权限:
|
||||
|
||||
- **相机权限** (`CAMERA`) - 用于拍摄照片
|
||||
- **存储权限** - 用于保存照片到相册
|
||||
- Android 12 及以下:`READ_EXTERNAL_STORAGE`, `WRITE_EXTERNAL_STORAGE` (maxSdkVersion: 32)
|
||||
- 相机权限:`CAMERA`
|
||||
- 读取存储/媒体:
|
||||
- Android 12 及以下:`READ_EXTERNAL_STORAGE`, `WRITE_EXTERNAL_STORAGE`
|
||||
- Android 13+:`READ_MEDIA_IMAGES`
|
||||
|
||||
权限会在首次使用时自动请求。如果拒绝权限,应用可能无法正常工作。
|
||||
这些权限会在第一次使用相关功能时弹出请求。
|
||||
|
||||
## 配置说明
|
||||
---
|
||||
|
||||
### 修改拍照间隔
|
||||
### YOLO 服务配置
|
||||
|
||||
在 `lib/screens/camera_screen.dart` 中修改:
|
||||
YOLO 调用逻辑封装在 `lib/services/yolo_service.dart` 中:
|
||||
|
||||
```dart
|
||||
_timer = Timer.periodic(const Duration(seconds: 2), (timer) async {
|
||||
// 修改 Duration(seconds: 2) 中的数字
|
||||
});
|
||||
```
|
||||
- 默认使用 **模拟数据**:如果 `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` 的解析逻辑。
|
||||
|
||||
### 修改相机分辨率
|
||||
---
|
||||
|
||||
在 `lib/screens/camera_screen.dart` 中修改:
|
||||
### 常见问题
|
||||
|
||||
```dart
|
||||
_controller = CameraController(
|
||||
_cameras![0],
|
||||
ResolutionPreset.high, // 可选: low, medium, high, veryHigh, ultraHigh, max
|
||||
enableAudio: false,
|
||||
);
|
||||
```
|
||||
|
||||
### 配置 YOLO API
|
||||
|
||||
在 `lib/services/yolo_service.dart` 中修改:
|
||||
|
||||
```dart
|
||||
static const String yoloApiUrl = 'http://your-api-url/api/detect';
|
||||
```
|
||||
|
||||
## 开发说明
|
||||
|
||||
### 主要功能实现
|
||||
|
||||
- **持续拍照逻辑**:使用 `Timer.periodic` 实现定时拍照,通过状态控制启停
|
||||
- **照片保存**:使用 `gal` 包(移动平台)或 `path_provider`(Web/桌面平台)保存照片
|
||||
- **权限管理**:使用 `permission_handler` 请求和检查权限
|
||||
- **状态管理**:使用 `StatefulWidget` 管理拍照状态和照片列表
|
||||
- **YOLO 分析**:使用 `http` 包调用 YOLO API,支持批量分析
|
||||
|
||||
### 平台差异
|
||||
|
||||
- **移动平台(Android/iOS)**:使用 `camera` 包实现相机预览和自动拍照
|
||||
- **Web/桌面平台**:使用 `image_picker` 包,但只能手动拍照(不支持自动连续拍照)
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 拍照后照片没有保存到相册?
|
||||
|
||||
A: 检查是否授予了存储/照片权限。可以在设备设置中手动授予权限。
|
||||
|
||||
### Q: 相机无法打开?
|
||||
|
||||
A: 确保已授予相机权限,并检查设备是否有可用的相机。
|
||||
|
||||
### Q: YOLO 分析失败?
|
||||
|
||||
A: 检查 YOLO API 配置是否正确,以及网络连接是否正常。如果 API 不可用,应用会使用模拟数据。
|
||||
|
||||
### Q: Web 平台无法使用自动拍照功能?
|
||||
|
||||
A: Web 平台不支持 `camera` 包的自动连续拍照功能,这是浏览器安全限制。请在 Android 或 iOS 设备上使用。
|
||||
|
||||
### Q: 应用崩溃?
|
||||
|
||||
A: 检查 Flutter 和依赖包的版本是否兼容,运行 `flutter doctor` 检查环境。
|
||||
|
||||
## 构建发布版本
|
||||
|
||||
### Android
|
||||
- **构建失败(Gradle / AGP / Java 版本相关)**
|
||||
- 本项目已升级至:
|
||||
- Gradle Wrapper:8.11.1
|
||||
- Android Gradle Plugin:8.9.1
|
||||
- Kotlin:2.1.0
|
||||
- Java:17
|
||||
- 若本地 JDK 版本不一致,请确认 `JAVA_HOME` 指向 JDK 17,并重新执行:
|
||||
|
||||
```bash
|
||||
flutter build apk --release
|
||||
cd android
|
||||
.\gradlew clean
|
||||
```
|
||||
|
||||
或者构建 App Bundle(用于 Google Play):
|
||||
- **相机不可用 / 权限被拒绝**
|
||||
- 请在系统设置中检查本应用是否已被授予相机和照片/媒体库权限。
|
||||
|
||||
```bash
|
||||
flutter build appbundle --release
|
||||
```
|
||||
- **Web/桌面端没有自动连续拍照**
|
||||
- 这是预期行为:当前实现是 **移动端自动连续拍照**,Web/桌面使用 **交互式选择图片**(`image_picker`),以适配平台限制。
|
||||
|
||||
### iOS
|
||||
---
|
||||
|
||||
```bash
|
||||
flutter build ios --release
|
||||
```
|
||||
### 许可证与贡献
|
||||
|
||||
### Web
|
||||
- 许可证:MIT License
|
||||
- 欢迎提交 Issue / Pull Request 来改进自动拍照、YOLO 识别效果或多平台体验。
|
||||
|
||||
```bash
|
||||
flutter build web --release
|
||||
```
|
||||
|
||||
## 版本信息
|
||||
|
||||
- **Flutter SDK**: >=3.0.0
|
||||
- **Dart SDK**: >=3.0.0
|
||||
- **Android Gradle Plugin**: 8.9.1
|
||||
- **Gradle**: 8.11.1
|
||||
- **Kotlin**: 2.1.0
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
|
||||
## 贡献
|
||||
|
||||
欢迎提交 Issue 和 Pull Request!
|
||||
|
||||
## 更新日志
|
||||
|
||||
### v1.0.0 (当前版本)
|
||||
|
||||
- ✅ 实现持续拍照功能(每2秒拍摄,直到点击停止)
|
||||
- ✅ 照片自动保存到相册
|
||||
- ✅ 集成 YOLO 图像分析功能
|
||||
- ✅ 结果展示页面
|
||||
- ✅ 支持 Android、iOS、Web、桌面平台
|
||||
- ✅ 完善的权限管理
|
||||
- ✅ 友好的用户界面
|
||||
|
||||
@@ -33,7 +33,7 @@ class WelcomeScreen extends StatelessWidget {
|
||||
|
||||
// 标题
|
||||
const Text(
|
||||
'sight-identification',
|
||||
'自动拍照应用',
|
||||
style: TextStyle(
|
||||
fontSize: 32,
|
||||
fontWeight: FontWeight.bold,
|
||||
@@ -46,7 +46,7 @@ class WelcomeScreen extends StatelessWidget {
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Text(
|
||||
'点击按钮开始自动拍照\n每2秒拍摄一次',
|
||||
'点击按钮开始自动拍照\n每2秒拍摄一次,共拍摄5张照片',
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
|
||||
@@ -76,7 +76,7 @@ class BoundingBox {
|
||||
|
||||
class YOLOService {
|
||||
// 配置YOLO API端点(用户可以修改)
|
||||
static const String yoloApiUrl = 'http://10.168.2.249:3000/api/upload';
|
||||
static const String yoloApiUrl = 'http://localhost:8000/api/detect';
|
||||
|
||||
// 分析单张图片
|
||||
Future<YOLOAnalysisResult> analyzeImage(String imagePath) async {
|
||||
|
||||
Reference in New Issue
Block a user