0

这是我的 Activity 类的代码:

    @Override protected void onCreate(Bundle savedInstanceState)
    {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);

        _cpf = ProcessCameraProvider.getInstance(this);
        _cpf.addListener(new Runnable() {
            @Override
            public void run() {
                try {
                    ProcessCameraProvider cameraProvider = _cpf.get();
                    bindImageAnalysis(cameraProvider);
                } catch (ExecutionException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, ContextCompat.getMainExecutor(this));
    }

    private void bindImageAnalysis(@NonNull ProcessCameraProvider cameraProvider) {
        ImageAnalysis imageAnalysis =
                new ImageAnalysis.Builder().setTargetResolution(new Size(640, 360))
                        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST).build();
        imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), new ImageAnalysis.Analyzer() {
            @Override
            public void analyze(@NonNull ImageProxy ip) {
                processImage(ip.getImage(), ip.getImageInfo().getRotationDegrees());
                ip.close();
            }
        });
        CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();
        cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, imageAnalysis);
    }

在每个analyze回调中,MLKit 都指示它 InputImage.fromMediaImage(ip.getImage(),ip.getImageInfo().getRotationDegrees()).getByteBuffer()为空。我该如何解释这个?这是否总是意味着图像为空?

4

2 回答 2

1

inputImage.getByteBuffer() 是一种内部方法,不是为公共使用而设计的。只有当您使用字节缓冲区或字节数组构造图像时,此方法才会返回。如果您需要使用 android 媒体图像中的字节缓冲区,则需要自己进行转换。

此外,我们对 Firebase ML Kit 进行了一些更改,以更好地区分设备端 API 和基于云的 API。“ ML Kit ”(没有 Firebase 品牌)包含所有设备上的 API。这是从 firebase mlkit 到 mlkit 的迁移指南。所有进一步的改进和新的 API 将仅与新的 ML Kit 一起发布。

于 2021-03-31T16:52:27.450 回答
0

问题在于我.close()过早地学习了。PoseDetector处理是异步的,因此processImage被调用并在之后立即调用ip.close()。调用时ip.close(), processImage 仍在工作,所以这就是Attempt to invoke virtual method 'java.nio.ByteBuffer android.media.Image$Plane.getBuffer(). 与其在方法.close()内部使用,不如在oranalyze结束时调用。OnSuccessListenerOnSuccessListener

这是完整的例子

于 2021-04-01T08:32:19.933 回答