【发布时间】:2019-06-11 07:41:32
【问题描述】:
随着颤振相机版本 0.2.8 中图像流的引入,我尝试将其集成到我的项目中以与 AWS 一起使用。
亚马逊要求图片格式为:
- 最多 5 MB 的图像字节块。
- 类型:Base64 编码的二进制数据对象
- 长度约束:最小长度为 1。最大长度为 5242880。
以前我使用 Camera 包来拍照,加载图片,然后将其转换为亚马逊所需的,但使用 ImageStream 更适合我想做的事情。我之前的做法是:
// Take the picutre
await _cameraController.takePicture(path);
// Load it from my filesystem
File imagefile = new File(path);
// Convert to amazon requirements
List<int> imageBytes = imagefile.readAsBytesSync();
String base64Image = base64Encode(imageBytes);
但是,使用图像流,我找不到任何简单的方法将CameraImage 转换为亚马逊需要的格式。我对图像没有太多经验,所以我很困惑。
我试图操纵firebase ml & camera stream demo中使用的代码
final int numBytes =
image.planes.fold(0, (count, plane) => count += plane.bytes.length);
final Uint8List allBytes = Uint8List(numBytes);
int nextIndex = 0;
for (int i = 0; i < image.planes.length; i++) {
allBytes.setRange(nextIndex, nextIndex + image.planes[i].bytes.length,
image.planes[i].bytes);
nextIndex += image.planes[i].bytes.length;
}
// Convert as done previously
String base64Image = base64Encode(allBytes);
但是,AWS 回复了 InvalidImageFormatException。如果有人知道如何正确编码图像,那就太棒了!谢谢
【问题讨论】:
-
您为什么认为
CameraImage更适合您?它可以访问未压缩的像素数据,而 AWS 似乎需要压缩的编码数据,例如 PNG 或 JPG。 (“Amazon Rekognition 支持 PNG 和 JPEG 图像格式。也就是说,您作为各种 API 操作(例如 DetectLabels 和 IndexFaces)的输入提供的图像必须是受支持的格式之一。”)您试图通过以下方式获得什么好处从有效的方式切换到这种新的方式?如果您从原始字节开始,您将需要自己进行压缩/编码 - 这非常慢。 -
@RichardHeap 我想使用
CameraImage的原因是因为我同时使用 AWS 和 firebase ml 进行面部检测然后进行匹配。 Firebase ml 允许我检测是否有在 example I linked in my post 中完成的人脸。从CameraImage检测到一张脸后,我想使用同一张照片,将其转换为亚马逊对matching a face 的要求。之后拍照可能会导致人移动并超出框架:( -
您得到的
CameraImage几乎肯定是YUV 420 格式(检查cameraImage.format.group以确认)。将其转换为 RGB,然后转换为 PNG 或 JPEG 并非易事,并且可能在本机代码中做得最好。例如,Android 有一个YUVImage类,它有一个compressToJpeg方法。尝试在纯 Dart 中做到这一点可能会非常s-l-o-w。您最终可能会编写一个插件来调用原生 Android 和 iOS 函数。有一篇有趣的文章here。 -
@RobC 也一样
-
@RobC 还是同样的解决方案?您找到更好的解决方案了吗?
标签: amazon-web-services dart camera flutter