Flutter机器学习视觉识别插件google_ml_vision的使用
Flutter机器学习视觉识别插件google_ml_vision的使用
Google ML Kit Vision Plugin
(官方链接)
google_ml_vision
是一个Flutter插件,它允许开发者在移动设备上使用Google ML Kit Vision API的能力。这些能力包括但不限于条形码检测、面部检测、图像标签和文本识别等。
使用步骤
1. 在项目中添加依赖
要在项目中使用这个插件,首先需要将 google_ml_vision
添加为项目的依赖。你可以在 pubspec.yaml
文件中添加如下配置:
dependencies:
flutter:
sdk: flutter
google_ml_vision: ^latest_version # 替换为最新版本号
然后执行 flutter pub get
命令来安装依赖。
2. 创建 GoogleVisionImage
对象
要对图片进行处理,首先需要创建一个 GoogleVisionImage
对象。可以从文件或字节数据创建此对象:
import 'package:google_ml_vision/google_ml_vision.dart';
final File imageFile = getImageFile(); // 获取图片文件
final GoogleVisionImage visionImage = GoogleVisionImage.fromFile(imageFile);
3. 创建检测器实例
根据需求选择不同的检测器,例如条形码检测器、面部检测器、图像标签器或文本识别器:
final BarcodeDetector barcodeDetector = GoogleVision.instance.barcodeDetector();
final FaceDetector faceDetector = GoogleVision.instance.faceDetector();
final ImageLabeler labeler = GoogleVision.instance.imageLabeler();
final TextRecognizer textRecognizer = GoogleVision.instance.textRecognizer();
对于除 TextRecognizer
外的所有检测器,还可以通过提供选项来自定义它们的行为:
final ImageLabeler labeler = GoogleVision.instance.imageLabeler(
ImageLabelerOptions(confidenceThreshold: 0.75),
);
4. 执行检测操作
使用 detectInImage()
或 processImage()
方法来处理 visionImage
对象,并获取结果:
final List<Barcode> barcodes = await barcodeDetector.detectInImage(visionImage);
final List<Face> faces = await faceDetector.processImage(visionImage);
final List<ImageLabel> labels = await labeler.processImage(visionImage);
final VisionText visionText = await textRecognizer.processImage(visionImage);
5. 提取数据
从返回的结果中提取所需的数据。以下是针对不同类型的数据提取方式的例子:
-
提取条形码信息:
for (Barcode barcode in barcodes) { final String rawValue = barcode.rawValue; final BarcodeValueType valueType = barcode.valueType; switch (valueType) { case BarcodeValueType.wifi: final String ssid = barcode.wifi.ssid; final String password = barcode.wifi.password; final BarcodeWiFiEncryptionType type = barcode.wifi.encryptionType; break; case BarcodeValueType.url: final String title = barcode.url.title; final String url = barcode.url.url; break; } }
-
提取面部信息:
for (Face face in faces) { final double rotY = face.headEulerAngleY; final double rotZ = face.headEulerAngleZ; final FaceLandmark leftEar = face.getLandmark(FaceLandmarkType.leftEar); if (leftEar != null) { final Point<double> leftEarPos = leftEar.position; } if (face.smilingProbability != null) { final double smileProb = face.smilingProbability; } if (face.trackingId != null) { final int id = face.trackingId; } }
-
提取标签信息:
for (ImageLabel label in labels) { final String text = label.text; final String entityId = label.entityId; final double confidence = label.confidence; }
-
提取文本信息:
String text = visionText.text; for (TextBlock block in visionText.blocks) { final Rect boundingBox = block.boundingBox; final List<Offset> cornerPoints = block.cornerPoints; final String blockText = block.text; final List<RecognizedLanguage> languages = block.recognizedLanguages; for (TextLine line in block.lines) { for (TextElement element in line.elements) { // 同样的getter方法适用于TextBlock } } }
6. 释放资源
当不再需要使用某个检测器时,请记得调用其 close()
方法以释放相关资源:
barcodeDetector.close();
faceDetector.close();
labeler.close();
textRecognizer.close();
示例代码
以下是一个完整的示例应用程序,展示了如何结合相机预览界面实现条形码扫描功能:
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart=2.9
import 'package:flutter/material.dart';
import 'camera_preview_scanner.dart'; // 自定义页面,用于展示相机预览并扫描条形码
import 'material_barcode_scanner.dart'; // 自定义页面,用于展示扫描结果
import 'picture_scanner.dart'; // 自定义页面,用于从图片中扫描条形码
void main() {
runApp(
MaterialApp(
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _ExampleList(),
'/PictureScanner': (BuildContext context) => const PictureScanner(),
'/CameraPreviewScanner': (BuildContext context) =>
const CameraPreviewScanner(),
'/MaterialBarcodeScanner': (BuildContext context) =>
const MaterialBarcodeScanner(),
},
),
);
}
class _ExampleList extends StatefulWidget {
@override
State<StatefulWidget> createState() => _ExampleListState();
}
class _ExampleListState extends State<_ExampleList> {
static final List<String> _exampleWidgetNames = [
'PictureScanner',
'CameraPreviewScanner',
'MaterialBarcodeScanner',
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Example List'),
),
body: ListView.builder(
itemCount: _exampleWidgetNames.length,
itemBuilder: (BuildContext context, int index) {
final String widgetName = _exampleWidgetNames[index];
return Container(
decoration: const BoxDecoration(
border: Border(bottom: BorderSide(color: Colors.grey)),
),
child: ListTile(
title: Text(widgetName),
onTap: () => Navigator.pushNamed(context, '/$widgetName'),
),
);
},
),
);
}
}
以上内容提供了关于如何在Flutter应用中集成和使用 google_ml_vision
插件的基本指导。你可以根据自己的具体需求调整代码逻辑。
更多关于Flutter机器学习视觉识别插件google_ml_vision的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter机器学习视觉识别插件google_ml_vision的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用google_ml_vision
插件进行视觉识别的代码示例。这个示例将展示如何使用Google ML Kit进行文本识别(Text Recognition)。
首先,你需要在你的pubspec.yaml
文件中添加google_ml_vision
依赖项:
dependencies:
flutter:
sdk: flutter
google_ml_vision: ^0.13.0 # 请确保使用最新版本
然后,运行flutter pub get
来安装依赖项。
接下来,是主要的Dart代码部分。这里我们创建一个简单的Flutter应用,它使用相机捕获图像并使用Google ML Kit进行文本识别。
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:google_ml_vision/google_ml_vision.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CameraApp(),
);
}
}
class CameraApp extends StatefulWidget {
@override
_CameraAppState createState() => _CameraAppState();
}
class _CameraAppState extends State<CameraApp> {
CameraController? controller;
final List<CameraDescription> cameras = [];
TextEditingController? textController;
@override
void initState() {
super.initState();
availableCameras().then((availableCameras) {
setState(() {
cameras.clear();
cameras.addAll(availableCameras);
});
if (cameras.isNotEmpty) {
controller = new CameraController(
cameras[0],
ResolutionPreset.medium,
);
controller!.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
});
}
}).catchError((err) {
print('Error: ${err.code}\n${err.message}');
});
textController = TextEditingController();
}
@override
void dispose() {
controller?.dispose();
textController?.dispose();
super.dispose();
}
void _processImage(CameraImage image) async {
final inputImage = InputImage.fromBytes(
bytes: image.planes[0].bytes,
size: Size(image.width, image.height),
imageRotation: image.orientation,
format: InputImageFormat.NV21,
);
final recognizer = TextRecognizer();
final result = await recognizer.process(inputImage);
// 获取识别结果
final blocks = result.blocks;
if (blocks.isNotEmpty) {
String recognizedText = blocks[0].text;
textController?.value = TextEditingValue(text: recognizedText);
}
recognizer.close();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Camera with ML Kit'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
controller?.value?.isInitialized == true
? AspectRatio(
aspectRatio: controller!.value.aspectRatio,
child: CameraPreview(controller!),
)
: Container(),
Padding(
padding: const EdgeInsets.all(16.0),
child: TextField(
controller: textController,
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Recognized Text',
),
readOnly: true,
),
),
ElevatedButton(
onPressed: () async {
if (controller?.value?.isCapturingImage == true) {
return;
}
controller?.startImageCapture()?.addListener(
(_, __) {
_processImage(controller!.lastImage!);
controller?.stopImageCapture();
},
);
},
child: Text('Capture & Recognize'),
),
],
),
);
}
}
在这个示例中,我们使用了camera
插件来捕获图像,并使用google_ml_vision
插件进行文本识别。请注意,你还需要在AndroidManifest.xml
和iOS
的Info.plist
文件中添加必要的权限和配置,以允许应用访问相机。
对于Android,你需要在AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET"/>
对于iOS,你需要在Info.plist
中添加以下权限:
<key>NSCameraUsageDescription</key>
<string>Need camera access</string>
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Need photo library access</string>
此外,由于camera
和google_ml_vision
插件可能会频繁更新,请务必查阅最新的官方文档以确保兼容性和最佳实践。