【问题标题】:Reading / converting camera stream images in Flutter在 Flutter 中读取/转换相机流图像
【发布时间】:2020-03-09 21:37:20
【问题描述】:

在我的 iOS 设备上,我通过CameraController(由camera 包提供)和controller.startImageStream((CameraImage img) {...} 访问相机

从相机出来的数据在我的手机上是 bgra8888 格式,但我读到它在 android 设备上是 yuv420 格式。要将图像流数据转换为可用的、一致的格式,我正在使用:

import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:image/image.dart' as im;

Uint8List concatenatePlanes(List<Plane> planes) {
  final WriteBuffer allBytes = WriteBuffer();
  planes.forEach((Plane plane) => allBytes.putUint8List(plane.bytes));
  return allBytes.done().buffer.asUint8List();
}

List<CameraDescription> cameras = await availableCameras();
CameraController controller = CameraController(cameras[0], ResolutionPreset.medium);

controller.startImageStream((CameraImage img) {
  print(img.format.group); // returns ImageFormatGroup.bgra8888

  List<int> imgData = concatenatePlanes(img.planes);
  im.Image image = im.decodeImage(imgData);
});

imgData 变量充满了从相机流出的数据,但从 decodeImage 返回的转换后的image 为空。

我在其他帖子中读到 image 包可以完成解码 bgra8888/yuv420 图像 (https://stackoverflow.com/a/57635827/479947) 的任务,但我没有看到它的格式支持。dart 源 (https://github.com/brendan-duncan/image/blob/master/lib/src/formats/formats.dart) .

目标Image格式定义为:

一个图像缓冲区,其中像素被编码为 32 位无符号整数 (Uint32)。像素存储在#AARRGGBB 中的 32 位无符号整数中 格式。这是为了与 Flutter 图像数据保持一致。

如何将 bgra8888/yuv420 中的图像流图像转换为所需的图像格式?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    你检查了吗? convertImage

    如果您从 bgra8888 转换为 Image,它会有点快,但 yuv420 到 Image 需要更多时间,所以如果您有性能问题,我可以根据我的经验提供一些帮助。顺便说一句,如果您遇到性能问题并尝试使用 Isolate,您将遇到内存问题。

    【讨论】:

    • 这看起来可以解决问题。我最终用相机快照切换了实时流媒体模型以提高性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多