Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android图像阅读器运动检测_Java_Android_Image Processing_Image Formats_Android Camera2 - Fatal编程技术网

Java Android图像阅读器运动检测

Java Android图像阅读器运动检测,java,android,image-processing,image-formats,android-camera2,Java,Android,Image Processing,Image Formats,Android Camera2,我正在开发一个应用程序,它必须能够基于androids camera2 API进行运动检测。所以我正在使用一个图像阅读器和相应的OnImageAvailableListener。我有两个用于CameraCaptureSession帧的目标曲面,即显示相机预览的UI SurfaceTexture和ImageReaders曲面 我有点“被迫”使用ImageFormat.YUV_420_88,原因与本问题中提到的相同: 我对这种格式有点陌生,我需要实现一个运动检测 我的想法是以像素为单位遍历Imag

我正在开发一个应用程序,它必须能够基于androids camera2 API进行运动检测。所以我正在使用一个图像阅读器和相应的OnImageAvailableListener。我有两个用于CameraCaptureSession帧的目标曲面,即显示相机预览的UI SurfaceTexture和ImageReaders曲面

我有点“被迫”使用ImageFormat.YUV_420_88,原因与本问题中提到的相同:

我对这种格式有点陌生,我需要实现一个运动检测

我的想法是以像素为单位遍历Image.getPlanes()[i].getBuffer(),并根据某个阈值比较两个图像

我有两个问题:

  • 这是个好主意吗?是否有更好/更有效的方法

  • YUV_420_88格式的哪个平面最适合此类运动检测

  • 这是个好主意吗?是否有更好/更有效的方法
  • 是的。 然后,没有其他方法比较连续帧来检测运动事件

  • YUV_420_88格式的哪个平面最适合此类运动检测
  • 我认为这是个问题[0]

    我的示例代码:

    mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader imageReader) {
                Image image = null;
                try {
                    image = imageReader.acquireLatestImage();
                    if (null == image) {
                        return;
                    }
                    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                    byte[] bytes = new byte[buffer.capacity()];
                    buffer.get(bytes);
    
                    detectMotion(bytes);
                } finally {
                    if (image != null) {
                        image.close();
                    }
                }
            }
    
            private void detectMotion(byte[] frame) {
                if (null == frame) {
                    return;
                }
    
                int ret = NativeUtil.detectMotion(frame);
                if (ret == 1) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mIvMotion.setVisibility(View.VISIBLE);
                        }
                    });
                    Log.d(TAG, "Detected motion event");
                } else {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mIvMotion.setVisibility(View.INVISIBLE);
                        }
                    });
                }
            }
        };
    

    NativeUtil.detectMotion在哪里?