我在 flutter 中创建了一个应用程序,可以使用 TensorFlow 对某人进行面部识别。
该应用程序打开相机并检查数据库中存储的面孔,或者检查面孔并允许用户将面孔添加到数据库中,以便下次记住它。
面部检测工作正常,但我遇到的问题是相机及其长宽比。在真正的 Android 相机上,相机似乎被不合理地拉伸,导致框被绘制到脸部的左侧。
@override
Widget build(BuildContext context) {
print(_detectedFaces.isNotEmpty ? _detectedFaces[0] : 'No faces detected');
if (_detectedFaces.isNotEmpty) {
// Show text Marked
}
List<Widget> stackChildren = [];
final size = MediaQuery.sizeOf(context);
if (_controller != null) {
stackChildren.add(Positioned(
top: 0.0,
left: 0.0,
width: size.width,
height: size.height,
child: CameraPreview(_controller)));
stackChildren.add(
Positioned(
top: 0.0,
left: 0.0,
width: size.width,
height: size.height,
child: buildResult()),
);
}
您可以使用aspectRatio来保持相机的比例,
然后使用 FittedBox 并指定宽度和高度。
这是一个使用带有aspectRatio的FittedBox的代码示例:
@override
Widget build(BuildContext context) {
print(_detectedFaces.isNotEmpty ? _detectedFaces[0] : 'No faces detected');
if (_detectedFaces.isNotEmpty) {
// Show text Marked
}
List<Widget> stackChildren = [];
final size = MediaQuery.sizeOf(context);
if (_controller != null) {
// Ensure the camera preview maintains its aspect ratio
final aspectRatio = _controller.value.aspectRatio;
stackChildren.add(Positioned(
top: 0.0,
left: 0.0,
width: size.width,
height: size.height,
child: ClipRect(
child: OverflowBox(
alignment: Alignment.center,
child: FittedBox(
fit: BoxFit.cover,
child: SizedBox(
width: size.width,
height: size.width / aspectRatio,
child: CameraPreview(_controller),
),
),
),
),
));
stackChildren.add(
Positioned(
top: 0.0,
left: 0.0,
width: size.width,
height: size.height,
child: buildResult(),
),
);
}
return Stack(children: stackChildren);
}