Flutter如何将CameraImage转换为InputImage

在Flutter开发中,使用camera插件获取到的CameraImage格式与ML Kit所需的InputImage格式不兼容。如何将CameraImage(YUV420格式)正确转换为InputImage,以便用于人脸识别或条形码扫描?求具体代码实现或可靠的转换方案。

2 回复

使用cameramlkit包,通过InputImage.fromBytes()转换。需提供图像数据、尺寸和图像旋转角度。注意处理YUV或RGB格式。

更多关于Flutter如何将CameraImage转换为InputImage的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中将CameraImage转换为InputImage(用于Google ML Kit)的方法如下:

核心转换方法

import 'package:google_ml_kit/google_ml_kit.dart';
import 'package:camera/camera.dart';

InputImage convertCameraImageToInputImage(CameraImage cameraImage, InputImageRotation rotation) {
  final WriteBuffer allBytes = WriteBuffer();
  
  for (final Plane plane in cameraImage.planes) {
    allBytes.putUint8List(plane.bytes);
  }
  
  final bytes = allBytes.done().buffer.asUint8List();
  
  final Size imageSize = Size(
    cameraImage.width.toDouble(),
    cameraImage.height.toDouble()
  );
  
  final InputImageFormat inputImageFormat = InputImageFormatValue.fromRawValue(
    cameraImage.format.raw
  ) ?? InputImageFormat.nv21;
  
  final planeData = cameraImage.planes.map(
    (Plane plane) {
      return InputImagePlaneMetadata(
        bytesPerRow: plane.bytesPerRow,
        height: plane.height,
        width: plane.width,
      );
    },
  ).toList();
  
  return InputImage.fromBytes(
    bytes: bytes,
    metadata: InputImageMetadata(
      size: imageSize,
      rotation: rotation,
      format: inputImageFormat,
      bytesPerRow: cameraImage.planes[0].bytesPerRow,
      planeData: planeData,
    ),
  );
}

使用示例

void processCameraImage(CameraImage image) {
  // 获取设备旋转信息(需要处理方向)
  final rotation = InputImageRotation.rotation0deg; // 根据实际情况调整
  
  final inputImage = convertCameraImageToInputImage(image, rotation);
  
  // 使用ML Kit进行处理
  final faceDetector = GoogleMlKit.vision.faceDetector();
  faceDetector.processImage(inputImage).then((faces) {
    // 处理检测结果
  });
}

注意事项

  1. 图像格式:确保处理正确的图像格式(通常是NV21或YUV_420_888)
  2. 旋转处理:根据设备方向正确设置InputImageRotation
  3. 性能优化:在实时处理时考虑性能影响

这种方法适用于大多数CameraImage到InputImage的转换场景。

回到顶部