如何调整颤动相机的长宽比被压缩以进行面部识别

问题描述 投票:0回答:1

我在 flutter 中创建了一个应用程序,可以使用 TensorFlow 对某人进行面部识别。

该应用程序打开相机并检查数据库中存储的面孔,或者检查面孔并允许用户将面孔添加到数据库中,以便下次记住它。

面部检测工作正常,但我遇到的问题是相机及其长宽比。在真正的 Android 相机上,相机似乎被不合理地拉伸,导致框被绘制到脸部的左侧。

Bounding box detected. The camera is compressed for some reason

  @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()),
      );
    }
android flutter image-processing android-camera
1个回答
0
投票

您可以使用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);
}

© www.soinside.com 2019 - 2024. All rights reserved.