Flutter如何将CameraImage转换为InputImage
在Flutter开发中,使用camera插件获取到的CameraImage格式与ML Kit所需的InputImage格式不兼容。如何将CameraImage(YUV420格式)正确转换为InputImage,以便用于人脸识别或条形码扫描?求具体代码实现或可靠的转换方案。
2 回复
使用camera和mlkit包,通过InputImage.fromBytes()转换。需提供图像数据、尺寸和图像旋转角度。注意处理YUV或RGB格式。
更多关于Flutter如何将CameraImage转换为InputImage的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中将CameraImage转换为InputImage(用于Google ML Kit)的方法如下:
核心转换方法
import 'package:google_ml_kit/google_ml_kit.dart';
import 'package:camera/camera.dart';
InputImage convertCameraImageToInputImage(CameraImage cameraImage, InputImageRotation rotation) {
final WriteBuffer allBytes = WriteBuffer();
for (final Plane plane in cameraImage.planes) {
allBytes.putUint8List(plane.bytes);
}
final bytes = allBytes.done().buffer.asUint8List();
final Size imageSize = Size(
cameraImage.width.toDouble(),
cameraImage.height.toDouble()
);
final InputImageFormat inputImageFormat = InputImageFormatValue.fromRawValue(
cameraImage.format.raw
) ?? InputImageFormat.nv21;
final planeData = cameraImage.planes.map(
(Plane plane) {
return InputImagePlaneMetadata(
bytesPerRow: plane.bytesPerRow,
height: plane.height,
width: plane.width,
);
},
).toList();
return InputImage.fromBytes(
bytes: bytes,
metadata: InputImageMetadata(
size: imageSize,
rotation: rotation,
format: inputImageFormat,
bytesPerRow: cameraImage.planes[0].bytesPerRow,
planeData: planeData,
),
);
}
使用示例
void processCameraImage(CameraImage image) {
// 获取设备旋转信息(需要处理方向)
final rotation = InputImageRotation.rotation0deg; // 根据实际情况调整
final inputImage = convertCameraImageToInputImage(image, rotation);
// 使用ML Kit进行处理
final faceDetector = GoogleMlKit.vision.faceDetector();
faceDetector.processImage(inputImage).then((faces) {
// 处理检测结果
});
}
注意事项
- 图像格式:确保处理正确的图像格式(通常是NV21或YUV_420_888)
- 旋转处理:根据设备方向正确设置
InputImageRotation - 性能优化:在实时处理时考虑性能影响
这种方法适用于大多数CameraImage到InputImage的转换场景。

