フラッター付きのモバイルアプリケーションを開発しています。 「controller.startImageStream」を使用してオブジェクト検出を実行します。このメソッドはCameraImageを返し、オブジェクト検出で使用します。このimgファイルを保存したい保存済みのこのファイル変換リストとjpgファイルを試しました。しかし、uint8listはリストに変換されません。この構造が本当の方法ですか、私の問題に対する別の勇気を知っているなら、私と共有してください。
これは私のビデオストリーミング方法です。
startVideoStreaming() {
if (cameras == null || cameras.length < 1) {
print('No camera is found');
} else {
controller = new CameraController(
cameras[0],
ResolutionPreset.medium,
);
if(!_busy){
controller.initialize().then((_) {
print("model yükleme bitmiş stream dinleme başlıyor ");
controller.startImageStream((CameraImage img){
print("img format: ${img.format} planes: ${img.planes}");
List<int> imageBytes = [];
img.planes.map((plane) {
imageBytes.addAll(plane.bytes.toList());
});
// call save image file method
saveImageFile(imageBytes).then((res) => {
print("save image file successfull filepath: $res")
}).catchError((err) => {
print("error on save image file error: $err")
});
if(!isDetecting){
isDetecting = true;
print("Tflite'a stream gönderildi");
Tflite.detectObjectOnFrame(
bytesList: img.planes.map((plane) {
return plane.bytes;
}).toList(),
model: "SSDMobileNet",
imageHeight: img.height,
imageWidth: img.width,
imageMean: 127.5,
imageStd: 127.5,
numResultsPerClass: 1,
threshold: 0.4,
).then((recognitions) {
int endTime = new DateTime.now().millisecondsSinceEpoch;
setState(() {
_recognitions=recognitions;
});
print("Recognitions: $recognitions");
isDetecting = false;
});
}
});
});
}
}
}
これは私の画像保存方法です。
Future<String> saveImageFile(imageBytes) async {
final Directory extDir = await getApplicationDocumentsDirectory();
final String dirPath = '${extDir.path}/Pictures/flutter_test';
await Directory(dirPath).create(recursive: true);
final String filePath = '$dirPath/${timestamp()}.jpg';
if (controller.value.isTakingPicture) {
// A capture is already pending, do nothing.
return null;
}
try {
File file = new File(filePath);
file.writeAsBytes(imageBytes);
print("finish image saved $imageBytes");
} on CameraException catch (e) {
_showCameraException(e);
return null;
}
return filePath;
}
次のコードスニペットを使用して、CameraImage YUV420またはBGRA8888を画像に変換できます。
gistからのコード: https://Gist.github.com/Alby-o/fe87e35bc21d534c8220aed7df028e
// imgLib -> Image package from https://pub.dartlang.org/packages/image
import 'package:image/image.Dart' as imglib;
import 'package:camera/camera.Dart';
Future<List<int>> convertImagetoPng(CameraImage image) async {
try {
imglib.Image img;
if (image.format.group == ImageFormatGroup.yuv420) {
img = _convertYUV420(image);
} else if (image.format.group == ImageFormatGroup.bgra8888) {
img = _convertBGRA8888(image);
}
imglib.PngEncoder pngEncoder = new imglib.PngEncoder();
// Convert to png
List<int> png = pngEncoder.encodeImage(img);
return png;
} catch (e) {
print(">>>>>>>>>>>> ERROR:" + e.toString());
}
return null;
}
// CameraImage BGRA8888 -> PNG
// Color
imglib.Image _convertBGRA8888(CameraImage image) {
return imglib.Image.fromBytes(
image.width,
image.height,
image.planes[0].bytes,
format: imglib.Format.bgra,
);
}
// CameraImage YUV420_888 -> PNG -> Image (compresion:0, filter: none)
// Black
imglib.Image _convertYUV420(CameraImage image) {
var img = imglib.Image(image.width, image.height); // Create Image buffer
Plane plane = image.planes[0];
const int shift = (0xFF << 24);
// Fill image buffer with plane[0] from YUV420_888
for (int x = 0; x < image.width; x++) {
for (int planeOffset = 0;
planeOffset < image.height * image.width;
planeOffset += image.width) {
final pixelColor = plane.bytes[planeOffset + x];
// color: 0x FF FF FF FF
// A B G R
// Calculate pixel color
var newVal = shift | (pixelColor << 16) | (pixelColor << 8) | pixelColor;
img.data[planeOffset + x] = newVal;
}
}
return img;
}