将 iOS YUV420 图像转换为 RGB [Flutter]

问题描述 投票:0回答:0

我正在使用 Flutter 为 iOS 和 Android 开发对象检测应用程序。我有 YUV420 格式的图像,我需要将它们转换为“图像”对象。为此,我将每个像素从 YUV240 转换为 RGB,然后使用图像库设置每个像素。

对于Android,以下代码有效:

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:image/image.dart' as img;

img.Image convertYUV420ToImage(CameraImage cameraImage) {
  final width = cameraImage.width;
  final height = cameraImage.height;

  final yRowStride = cameraImage.planes[0].bytesPerRow;
  final uvRowStride = cameraImage.planes[1].bytesPerRow;
  final uvPixelStride = cameraImage.planes[1].bytesPerPixel!;

  final image = img.Image(width:width, height:height);

  for (var w = 0; w < width; w++) {
    for (var h = 0; h < height; h++) {
      final uvIndex =
          uvPixelStride * (w / 2).floor() + uvRowStride * (h / 2).floor();
      final index = h * width + w;
      final yIndex = h * yRowStride + w;

      final y = cameraImage.planes[0].bytes[yIndex];
      final u = cameraImage.planes[1].bytes[uvIndex];
      final v = cameraImage.planes[2].bytes[uvIndex];

      image.data?.setPixel(w, h, yuv2rgb(y, u, v));
    }
  }
  return image;
}

但是,iOS 不使用具有 3 个平面的图像(它有 2 个平面),因此我需要为此编写一个新的 YUV420 到 RGB 转换函数。

我对图像格式和色彩空间不是很熟悉,但据我所知,iOS 将“u”和“v”数据存储在一个平面上。但是,我无法弄清楚这是如何完成的。

我做了一些尝试:

img.Image convertYUV420ToImage(CameraImage cameraImage) {
  final width = cameraImage.width;
  final height = cameraImage.height;

  final yRowStride = cameraImage.planes[0].bytesPerRow;
  final uvRowStride = cameraImage.planes[1].bytesPerRow;
  final uvPixelStride = cameraImage.planes[1].bytesPerPixel!;

  final image = img.Image(width:width, height:height);

  for (var w = 0; w < width; w++) {
    for (var h = 0; h < height; h++) {
      final uvIndex =
          uvPixelStride * (w / 2).floor() + uvRowStride * (h / 2).floor();
      final index = h * width + w;
      final yIndex = h * yRowStride + w;

      final y = cameraImage.planes[0].bytes[yIndex];
      int uvsByte = cameraImage.planes[1].bytes[uvIndex];// U/V byte
      int u = uvsByte & 0xFF; // extract the first 8 bits (U value)
      int v = (uvsByte >> 8) & 0xFF; // extract the next 8 bits (V value)
      // final u = cameraImage.planes[1].bytes[uvIndex];
      // final v = cameraImage.planes[2].bytes[uvIndex];

      image.data?.setPixel(w, h, yuv2rgb(y, u, v));
    }
  }
  return image;
}

但这会产生非常绿色的图像。 从这张图看,好像是我的U和V值太低了,才造成的。

我真的需要一些帮助将 iOS 2 平面 YUV420 图像转换为 RGB,谢谢!

flutter image rgb color-space
© www.soinside.com 2019 - 2024. All rights reserved.