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

1 回复

更多关于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.xmliOSInfo.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>

此外,由于cameragoogle_ml_vision插件可能会频繁更新,请务必查阅最新的官方文档以确保兼容性和最佳实践。

回到顶部