flutter - 如何从 Flutter 中的图像中获取 RGB 值?
问题描述
我正在为我的对象检测服务器创建一个移动客户端。我已经有一个运行良好的 python 客户端,它将图像作为输入,通过 HTTP 请求将其发送到服务器,并以 json 响应的形式接收预测。我试图在我相当新的 Dart 中实现同样的目标。
我的 python 代码将输入的 JPG 图像转换为以下格式的 RGB 值的 numpy 数组(以 5x4 图像为例)-
[
[[182, 171, 153], [203, 188, 169], [242, 214, 200], [255, 235, 219], [155, 111, 98]],
[[181, 171, 146], [204, 190, 164], [255, 237, 214], [177, 142, 120], [84, 42, 20]],
[[176, 168, 129], [218, 206, 166], [180, 156, 118], [91, 59, 21], [103, 64, 25]],
[[186, 180, 132], [166, 156, 107], [91, 68, 24], [94, 63, 17], [122, 84, 39]]
]
在我的飞镖代码中,我尝试将图像转换为 8 位无符号整数列表,使用 -
Uint8List inputImg = (await rootBundle.load("assets/test.jpg")).buffer.asUint8List()
对于同一张 5x4 图像,它为我提供了超过 800 个整数的长数组。
在使用两个单像素图像(一个黑色和一个白色)对其进行测试时,Uint8List 的大部分似乎都在重复。我隔离了数组的不同部分,它们与颜色的预期 RGB 值不对应(我预期 [0 0 0] 和 [255 255 255],但得到了类似 255、0、63、250、0、 255, 0 和 254, 254, 40, 3 分别代表两者)
我只需要图像中的 RGB 值。将不胜感激有人指出我正确的方向!
解决方案
图像在存储时通常会被压缩。根据文件扩展名,我猜您使用的是 JPEG 编码。这意味着存储在assets/test.jpg
文件中的数据不是颜色数组。如果一切都以这种方式完成,那将是对数据存储的低效使用。要获得该颜色数组,您需要对图像进行解码。这可以通过图像包来完成。
为此,首先将包添加为依赖项,方法是将以下内容添加到pubspec.yaml
:
dependencies:
image: ^3.0.4
您应该遵循获取编码图像数据的相同方法。但是您随后需要对其进行解码。
final Uint8List inputImg = (await rootBundle.load("assets/test.jpg")).buffer.asUint8List();
final decoder = JpegDecoder();
final decodedImg = decoder.decodeImage(inputImg);
final decodedBytes = decodedImg.getBytes(format: Format.rgb);
decodedBytes
包含 RGB 格式的所有像素值的单个深度列表。要将其转换为您想要的格式,只需遍历这些值并将它们添加到新列表中。
List<List<List<int>> imgArr = [];
for(int y = 0; y < decodedImage.height; y++) {
imgArr.add([]);
for(int x = 0; x < decodedImage.width; x++) {
int red = decodedBytes[y*decodedImage.width*3 + x*3];
int green = decodedBytes[y*decodedImage.width*3 + x*3 + 1];
int blue = decodedBytes[y*decodedImage.width*3 + x*3 + 2];
imgArr[y].add([red, green, blue]);
}
}
推荐阅读
- android - 如何管理来自特定不同活动的 NFC 标签读取
- javascript - 想将更新的“Second”合并到“MYJsonObj”
- laravel - Laravel 验证数量的字段数组不起作用
- windows - 使用批处理文件附加到系统 PATH 变量值
- nexus - 启动 Nexus docker 映像时如何设置管理员用户/密码
- c# - Angular 7、.netcore 应用程序上的 401(未经授权)请求
- excel - VBA将字段从外部应用程序复制到excel
- angular - Angular Material Table 更改特定行内容
- android - onRetrofitFailure() 无法从 START_OBJECT 令牌中反序列化 `java.util.ArrayList` 的实例
- javascript - 我想在 node.js 中发送没有 Enterkey 的消息