CameraX Image analysis的imageproxy大小和PreviewView大小不一样

Roc*_*666 3 android analysis image android-camerax

我正在尝试使用 Firebase 的 MLKit 通过 Camerax 进行人脸检测。我很难让图像分析的图像代理大小与 PreviewView 的大小相匹配。对于图像分析和 PreviewView,我已将 setTargetResolution() 设置为 PreviewView 的宽度和高度。但是,当我在分析器中检查 Imageproxy 的大小时,它的宽度为 1920,高度为 1080。我的 PreviewView 宽度为 1080,高度为 2042。当我在 setTargetResolution() 中交换宽度和高度以进行图像分析时,imageproxy 中的宽度和高度都为 1088。我的预览视图也被锁定为纵向模式。

最终,我需要将原始图像代理数据和人脸点数据输入到 AR 代码中。因此,仅放大绘制面部点的图形叠加对我来说不起作用。

问:如果无法在 camerax 库中解决此问题,如何缩放从分析器返回的图像代理以匹配预览视图?

我正在使用 Java 和最新的 Camerax 库:

def camerax_version = "1.0.0-beta08"

Hus*_*eem 5

很难确保预览和图像分析用例具有相同的输出分辨率,因为不同的设备支持不同的分辨率,并且图像分析对其输出的最大分辨率有硬性限制(如文档所述)。

为了使来自图像分析框架和 UI/PreviewView 的坐标之间的转换更容易,您可以将 preview 和 ImageAnalysis 设置为使用相同的纵横比,例如AspectRatio.RATIO_4_3,以及 PreviewView(例如,通过将其包装在 ConstraintLayout 中,以及对其宽高比设置约束)。这样,将检测到的人脸坐标从分析器映射到 UI 变得更加直接,您可以在此示例中查看它。

或者,您可以使用 CameraX 的ViewPort API,我相信它仍然处于试验阶段。它允许为一组用例定义一个视野,从而使它们的输出匹配并具有所见即所得。您可以在此处找到其用法示例。对于你的情况,你会写这样的东西。

Preview preview = ...
preview.setSurfaceProvider(previewView.getSurfaceProvider());

ImageAnalysis imageAnalysis = ...
imageAnalysis.setAnalyzer(...);

ViewPort viewPort = preview.getViewPort();
UseCaseGroup useCaseGroup = new UseCaseGroup.Builder()
                .setViewPort(viewPort)
                .addUseCase(preview)
                .addUseCase(imageAnalysis)
                .build();

cameraProvider.bindToLifecycle(
                lifecycleOwner,
                cameraSelector,
                usecaseGroup);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的分析器接收到的每个 ImageProxy 都将包含一个与 PreviewView 显示的内容匹配的裁剪矩形。所以你只需要裁剪你的图像,然后将它传递给人脸检测器。

  • 我无法尝试视口方法,因为 1)我找不到预览视图的 getSurfaceProvider() 。相反,我有 PreviewView.createSurfaceProvider()。2)我无法将 getViewPort() 分配给预览,因为 getViewPort() 不存在。不确定我在这里做错了什么。 (2认同)