flutter图片识别_在 Flutter 中实现实时图像检测

最近 Flutter 的官方插件 camera 加入了获取图像流的功能,利用该功能我们可以获取到相机预览的实时画面。

我用 camera 和 tflite 插件做了一个结合 TensorFlow Lite 的 Flutter 实时图像识别的 demo。

以下是在 iPad 上的演示视频:

使用 camera 插件的图像流功能:

首先按照 camera 插件 的文档在项目中加入相机功能。

然后调用 camera controller 的 startImageStream 方法获取图像流。这个方法在每次有新的帧时会被触发。

controller.startImageStream((CameraImage img) { });

方法的输出为 CameraImage,有 4 个属性: 图像格式, 高度, 宽度以及 planes ,planes 包含图像具体信息。

class CameraImage {

final ImageFormat format;

final int height;

final int width;

final List planes;

}

注意在不同平台上的图像格式并不相同:

由于图像格式不同,输出的 CameraImage 在 Android 和 iOS 端包含的信息也不一样:

Android: planes 含有三个字节数组,分别是 Y、U 和 V plane。

iOS:planes 只包含一个字节数组,即图像的 RGBA 字节。

了解输出的图像流之后,我们就可以将图像输入到 TensorFlow Lite 中了。

解析 CameraImage:

理论上使用 Dart 代码也可以解析图像,但是目前为止 dart 的 image 插件在 iOS 上速度很慢。 为了提高效率我们用原生代码来解析图像。

iOS:

因为图像已经是 RGBA 格式了,我们只需要获取红绿蓝三个通道的字节,然后输入到 TensorFlow Interpreter 的 input tensor 中。

const FlutterStandardTypedData* typedData = args[@"bytesList"][0];

uint8_t* in = (uint8_t*)[[typedData data] bytes];

float* out = interpreter->typed_tensor(input);

for (int y = 0; y < height; ++y) {

const int in_y = (y * image_height) / height;

uint8_t* in_row = in &#

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值