最近 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 &#