update README.md

This commit is contained in:
lzx
2026-01-07 16:42:22 +08:00
parent 5d95cf264d
commit e5bb205a79
4 changed files with 173 additions and 271 deletions

50
.gitignore vendored
View File

@@ -38,51 +38,15 @@ app.*.symbols
# Obfuscation related # Obfuscation related
app.*.map.json app.*.map.json
# Android related # Android Studio will place build artifacts here
/android/local.properties
/android/app/debug /android/app/debug
/android/app/profile /android/app/profile
/android/app/release /android/app/release
# iOS related # Node / backend related
**/ios/**/*.mode1v3 **/node_modules/
**/ios/**/*.mode2v3 npm-debug.log*
**/ios/**/*.moved-aside yarn-debug.log*
**/ios/**/*.pbxuser yarn-error.log*
**/ios/**/*.perspectivev3 pnpm-debug.log*
**/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.*
# 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
View File

@@ -1,280 +1,218 @@
# 自动拍照与图像分析应用 ## 自动拍照与情绪分析应用Flutter
一个使用 Flutter 开发的跨平台应用,实现持续拍照和 YOLO 图像分析功能。 这是一个使用 **Flutter** 开发的跨平台应用,主要面向 **Android**,同时兼容 **Web / Windows / macOS / Linux**
核心功能是:自动拍照、保存到相册,并使用 YOLO 模型对照片进行物体/情绪分析,最终在结果页展示分析信息。
## 功能特点 ---
- 📸 **持续拍照** - 点击开始后每2秒自动拍摄一张照片直到点击停止按钮 ### 功能概览
- 🖼️ **保存到相册** - 自动将拍摄的照片保存到设备相册
- 🤖 **YOLO 图像分析** - 对拍摄的照片进行 YOLO 目标检测分析
- 📊 **结果展示** - 在结果页面查看所有照片和分析结果
- 🎨 **简洁界面** - 美观的欢迎界面、相机界面和结果展示界面
- 📱 **跨平台支持** - 支持 Android、iOS、Web 和桌面平台
## 技术栈 - **欢迎页**
- 显示应用简介
- 「开始拍摄」按钮,进入相机/图片选择流程
- **Flutter** - 跨平台UI框架 - **自动拍照移动端Android / iOS**
- **camera** ^0.11.3 - 相机功能 - 使用 `camera` 插件打开系统摄像头
- **image_picker** ^1.0.7 - 图片选择Web/桌面平台) - 点击「开始拍摄」后,每 **2 秒** 自动拍一张照片
- **gal** ^2.0.1 - 保存图片到相册 - 点击「停止」后结束连续拍摄
- **permission_handler** ^12.0.1 - 权限管理 - 每张照片都会:
- **http** ^1.1.0 - HTTP 请求YOLO API 调用 - 保存到本地相册(使用 `gal`
- **path_provider** ^2.1.1 - 路径管理 - 调用 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 SDKAPI Level 21+
- 一台 Android 设备或模拟器(推荐在真实设备上测试)
### 1. 克隆项目 ### 技术栈与主要依赖
```bash - **框架**
git clone <repository-url> - Flutter推荐 Flutter 3.x 及以上)
cd view-app
- **核心插件**
- `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 SDKAPI 35 及以上,编译使用 `compileSdk 36`
- 一台 Android 真机或模拟器(用于运行移动端)
可通过以下命令检查环境:
```bash
flutter doctor
```
---
### 安装依赖
在项目根目录执行:
```bash ```bash
flutter pub get flutter pub get
``` ```
### 3. 运行应用 如果你需要使用 `lib/backend_model` 目录中的 Node 后端(例如承载真实 YOLO 服务或中转服务),需要单独安装该子项目的依赖:
#### 在 Android 设备上运行(推荐) ```bash
cd lib/backend_model
npm install
```
1. 启用设备的 USB 调试 ---
2. 连接设备到电脑
3. 运行: ### 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 ```bash
flutter run flutter run
``` ```
或者指定设备 如有多设备,可以指定设备 ID例如
```bash ```bash
flutter devices # 查看可用设备 flutter run -d "ALA AN70"
flutter run -d "设备名称"
``` ```
#### 在 Android 模拟器上运行 #### Web
1. 启动 Android 模拟器
2. 运行:
```bash
flutter run
```
#### 在 Web 浏览器中运行
```bash ```bash
flutter run -d chrome flutter run -d chrome
``` ```
**注意**Web 平台不支持自动连续拍照功能,需要使用 Android 或 iOS 设备。 #### Windows / macOS / Linux
## 项目结构 ```bash
flutter run -d 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 # 项目说明
``` ```
## 使用流程 ---
1. **启动应用**:打开应用,进入欢迎界面 ### 权限说明(移动端)
2. **开始拍照**:点击"开始拍照"按钮
3. **授予权限**:首次使用会请求相机和存储权限,请允许
4. **打开相机**:相机预览界面打开
5. **开始拍摄**:点击"开始拍照"按钮应用会每2秒自动拍摄一张照片
6. **查看进度**:顶部显示已拍摄的照片数量
7. **停止拍摄**:点击"停止拍照"按钮
8. **图像分析**:应用自动对拍摄的照片进行 YOLO 分析(显示分析中对话框)
9. **查看结果**:在结果页面查看所有照片和对应的分析结果
10. **完成**:点击"完成"按钮返回欢迎界面
## 功能说明 应用在 Android 上会请求以下权限:
### 持续拍照 - 相机权限:`CAMERA`
- 读取存储/媒体:
- 点击"开始拍照"后,应用会立即拍摄第一张照片 - Android 12 及以下:`READ_EXTERNAL_STORAGE`, `WRITE_EXTERNAL_STORAGE`
- 然后每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)
- Android 13+`READ_MEDIA_IMAGES` - Android 13+`READ_MEDIA_IMAGES`
权限会在次使用时自动请求。如果拒绝权限,应用可能无法正常工作 这些权限会在第一次使用相关功能时弹出请求
## 配置说明 ---
### 修改拍照间隔 ### YOLO 服务配置
在 `lib/screens/camera_screen.dart` 中修改 YOLO 调用逻辑封装在 `lib/services/yolo_service.dart`
```dart - 默认使用 **模拟数据**:如果 `YoloService.yoloApiUrl` 保持为占位地址(如 `http://your-yolo-api-url/api/detect`),则不会真实发起网络请求,而是返回随机模拟结果,方便本地开发和调试。
_timer = Timer.periodic(const Duration(seconds: 2), (timer) async { - 如需接入真实 YOLO 推理服务:
// 修改 Duration(seconds: 2) 中的数字 1.`yolo_service.dart` 中将 `yoloApiUrl` 修改为你的服务地址;
}); 2. 确认服务支持 `multipart/form-data` POST字段名为 `image`
``` 3. 根据你的返回 JSON 结构,必要时调整 `YOLOAnalysisResult.fromJson``DetectedObject.fromJson` 的解析逻辑。
### 修改相机分辨率 ---
在 `lib/screens/camera_screen.dart` 中修改: ### 常见问题
```dart - **构建失败Gradle / AGP / Java 版本相关)**
_controller = CameraController( - 本项目已升级至:
_cameras![0], - Gradle Wrapper8.11.1
ResolutionPreset.high, // 可选: low, medium, high, veryHigh, ultraHigh, max - Android Gradle Plugin8.9.1
enableAudio: false, - Kotlin2.1.0
); - Java17
``` - 若本地 JDK 版本不一致,请确认 `JAVA_HOME` 指向 JDK 17并重新执行
### 配置 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
```bash ```bash
flutter build apk --release cd android
.\gradlew clean
``` ```
或者构建 App Bundle用于 Google Play - **相机不可用 / 权限被拒绝**
- 请在系统设置中检查本应用是否已被授予相机和照片/媒体库权限。
```bash - **Web/桌面端没有自动连续拍照**
flutter build appbundle --release - 这是预期行为:当前实现是 **移动端自动连续拍照**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、桌面平台
- ✅ 完善的权限管理
- ✅ 友好的用户界面

View File

@@ -33,7 +33,7 @@ class WelcomeScreen extends StatelessWidget {
// 标题 // 标题
const Text( const Text(
'sight-identification', '自动拍照应用',
style: TextStyle( style: TextStyle(
fontSize: 32, fontSize: 32,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@@ -46,7 +46,7 @@ class WelcomeScreen extends StatelessWidget {
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 40), padding: const EdgeInsets.symmetric(horizontal: 40),
child: Text( child: Text(
'点击按钮开始自动拍照\n每2秒拍摄一次', '点击按钮开始自动拍照\n每2秒拍摄一次共拍摄5张照片',
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,

View File

@@ -76,7 +76,7 @@ class BoundingBox {
class YOLOService { class YOLOService {
// 配置YOLO API端点用户可以修改 // 配置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 { Future<YOLOAnalysisResult> analyzeImage(String imagePath) async {