Flutter/Camera Plugin 0.5.3 上的设备方向不正确

Posted

技术标签:

【中文标题】Flutter/Camera Plugin 0.5.3 上的设备方向不正确【英文标题】:Device Orientation Incorrect on Flutter/Camera Plugin 0.5.3 【发布时间】:2019-12-23 00:07:00 【问题描述】:

我是 Flutter 和 Dart 的新手,我正在尝试使用 XIAOMI MI 9 SE (android) 上的 Camera Plugin 来检测我的 TensorFlow Lite 模型上的对象。一切都在纵向模式下工作,但是当我将智能手机打开横向视图时,预览不会旋转,保持纵向的方向并且看起来不正确。

我尝试使用其他版本的相机插件,但没有用。

detectObjectOnFrame 代码:

         ` Tflite.detectObjectOnFrame(
            bytesList: img.planes.map((plane) 
              return plane.bytes;
            ).toList(),
            model: widget.model == yolo ? "YOLO" : "SSDMobileNet",
            imageHeight: img.height,
            imageWidth: img.width,
            imageMean: widget.model == yolo ? 0 : 127.5,
            imageStd: widget.model == yolo ? 255.0 : 127.5,
            numResultsPerClass: 1,
            threshold: widget.model == yolo ? 0.2 : 0.4,
          ).then((recognitions) 
            int endTime = new DateTime.now().millisecondsSinceEpoch;
            print("Detection took $endTime - startTime");

            widget.setRecognitions(recognitions, img.height, img.width);

            isDetecting = false;`

CAMERA.DART 文件:

final List cameras;
final Callback setRecognitions;
final String model;

Camera(this.cameras, this.model, this.setRecognitions);

_CameraState createState() => new _CameraState();


class _CameraState extends State 
CameraController controller;
bool isDetecting = false;

void initState() 
super.initState();

if (widget.cameras == null || widget.cameras.length < 1) 
  print('No camera is found');
 else 
  controller = new CameraController(
    widget.cameras[0],
    ResolutionPreset.high,
  );
  controller.initialize().then((_) 
    if (!mounted) 
      return;
    
    setState(() );

    controller.startImageStream((CameraImage img) 
      if (!isDetecting) 
        isDetecting = true;

        int startTime = new DateTime.now().millisecondsSinceEpoch;

        if (widget.model == mobilenet) 
          ..........
           .......... (Ignored code)

            isDetecting = false;
          );
         else 
          Tflite.detectObjectOnFrame(
           ..........
           .......... (Ignored code)

          );
        
      
    );
  );



void dispose() 
controller?.dispose();
super.dispose();


Widget build(BuildContext context) 
if (controller == null || !controller.value.isInitialized) 
return Container();


var tmp = MediaQuery.of(context).size;
var screenH = math.max(tmp.height, tmp.width);
var screenW = math.min(tmp.height, tmp.width);
tmp = controller.value.previewSize;
var previewH = math.max(tmp.height, tmp.width);
var previewW = math.min(tmp.height, tmp.width);
var screenRatio = screenH / screenW;
var previewRatio = previewH / previewW;

return OverflowBox(
  maxHeight:
      screenRatio > previewRatio ? screenH : screenW / previewW * previewH,
  maxWidth:
      screenRatio > previewRatio ? screenH / previewH * previewW : screenW,
  child: CameraPreview(controller),
);


HOME.DART:

setState(() 
_model = model;
);
loadModel();


setRecognitions(recognitions, imageHeight, imageWidth) 
setState(() 
_recognitions = recognitions;
_imageHeight = imageHeight;
_imageWidth = imageWidth;
);


@override
Widget build(BuildContext context) 
Size screen = MediaQuery.of(context).size;
return Scaffold(
body: _model == ""
? Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
child: const Text(yolo),
onPressed: () => onSelect(yolo),
),
],
),
)
: Stack(
children: [
Camera(
widget.cameras,
_model,
setRecognitions,
),
BndBox(
_recognitions == null ? [] : _recognitions,
math.max(_imageHeight, _imageWidth),
math.min(_imageHeight, _imageWidth),
screen.height,
screen.width,
_model),
],
),
);



Pubspec.yaml:

flutter_test:
sdk: flutter

camera: ^0.5.3
tflite: 1.0.4

此代码在横向视图中显示不正确的图像,预览无法与智能手机一起转动。

感谢任何帮助。谢谢。

【问题讨论】:

【参考方案1】:

在横向模式下,您可以在 CameraPreview 周围放置一个RotatedBox。它不应该改变 TFlite 的输入:帧将在横向到达 detectObjectOnFrame(),所以如果涉及一些特殊的旋转,你应该禁用它。

【讨论】:

感谢亚历克斯的回答!我实际上找到了这部分代码,我正在用代码更新主帖,如果你能帮助我,我真的很感激! 另一个问题,我在使用RotatedBox的代码上找不到“CameraPreview”... Camera.dart 的 OverflowBox 中有 CameraPreview 小部件。只有您可以在小部件层次结构中找到正确的位置来放置 RotatedBox。 例如:RotatedBox( QuarterTurns: MediaQuery.of(context).orientation == Orientation.landscape ? 3 : 0, child: AspectRatio( aspectRatio: controller.value.aspectRatio, child: CameraPreview(controller) , ), );

以上是关于Flutter/Camera Plugin 0.5.3 上的设备方向不正确的主要内容,如果未能解决你的问题,请参考以下文章

流式传输时 Flutter camera 0.8.1 闪烁

多数组的 math.random()-0.5

未能执行目标 org.apache.maven.plugins:maven-resources-plugin:2.5:resources

在linux环境下,在eclipse中导入mahout-distribution-0.5,导入完成后好多错误,见图,请大侠们指教

如果工作区中存在工作灯项目,则 com.worklight.studio.plugin 线程在 Eclipse 启动时挂起

Maven “Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:create...”问题总结(示例代