Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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
使用Android camera2 API和OpenCV的图像处理框架_Android_Opencv_Image Processing_Android Camera2 - Fatal编程技术网

使用Android camera2 API和OpenCV的图像处理框架

使用Android camera2 API和OpenCV的图像处理框架,android,opencv,image-processing,android-camera2,Android,Opencv,Image Processing,Android Camera2,我是camera2 api的新手。我想在我的Android手机上构建一个图像处理框架 步骤1:使用Camera2 API打开相机预览流 步骤2:将预览帧数据馈送到OpenCV进行处理 步骤3:在屏幕上实时显示处理结果 目前,我已经完成了使用代码< > IMAGEDEADER 和C++ OpenCV代码的步骤1。然而,我不知道如何做第三步。 如何在屏幕上显示处理后的图像?(我想显示普通图像,如果检测到预定义对象,则覆盖一个图标) 以下是一些关键代码: protected void createCa

我是camera2 api的新手。我想在我的Android手机上构建一个图像处理框架

步骤1:使用Camera2 API打开相机预览流

步骤2:将预览帧数据馈送到OpenCV进行处理

步骤3:在屏幕上实时显示处理结果

目前,我已经完成了使用代码< > IMAGEDEADER 和C++ OpenCV代码的步骤1。然而,我不知道如何做第三步。 如何在屏幕上显示处理后的图像?(我想显示普通图像,如果检测到预定义对象,则覆盖一个图标)

以下是一些关键代码:

protected void createCameraPreview() {
    try {
        SurfaceTexture texture = textureView.getSurfaceTexture();
        assert texture != null;
        texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
      //  Surface surface = new Surface(texture);
        Surface mImageSurface = mImageReader.getSurface();
        captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
      //  captureRequestBuilder.addTarget(surface);

        captureRequestBuilder.addTarget(mImageSurface);


        cameraDevice.createCaptureSession(Arrays.asList(mImageSurface), new CameraCaptureSession.StateCallback(){
                    @Override
                    public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                        //The camera is already closed
                        if (null == cameraDevice) {
                            return;
                        }
                        cameraCaptureSessions = cameraCaptureSession;
                        updatePreview();
                    }
                    @Override
                    public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                        Toast.makeText(MainActivity.this, "Configuration change", Toast.LENGTH_SHORT).show();
                    }
                }, null);
        } catch (CameraAccessException e) {
             e.printStackTrace();
        }
}

protected void updatePreview() {
    if(null == cameraDevice) {
        Log.e(TAG, "updatePreview error, return");
    }
    try {
        cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

  private final ImageReader.OnImageAvailableListener mOnImageAvailableListener  = new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) {
        Log.e(TAG, "onImageAvailable: " + count++);
        Image img = null;
        img = reader.acquireNextImage();
        try {
            if (img == null) throw new NullPointerException("cannot be null");
            ByteBuffer buffer = img.getPlanes()[0].getBuffer();
            byte[] data = new byte[buffer.remaining()];
            buffer.get(data);
            int width = img.getWidth();
            int height = img.getHeight();

            // ****try to get captured img for display here (synchronized)

            // ****try to process image for detecting the object here (asynchronized)

        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }finally {
            Log.e(TAG, "in the finally! ------------");
            if (img != null)
                img.close();

        }
    }

};

小君,你知道怎么做了吗?因为我也对这个话题感兴趣。我正在研究它。这离成功很近了。基本上,我使用renderscript将捕获的YUV_420_888图像转换为RGB位图。然后使用Opencv(NDK)对其进行处理。很快就会更新。小君,听起来不错。我希望能找到实时工作的东西,在使用相机时重新处理实时的动态图像。但是限制相机的曝光(这样它就不会不断调整曝光)和处理实时图像一直是个问题。我可以在OpenCV使用C++处理一个实时图像,并且我可以用摄像头来控制相机,但是这两个问题都是一个问题。我将补充说,我不知道如何控制或限制相机在OpenCV的捕获,因为OpenCV不能直接与安卓。在预览会话开始之前,使用…camera2曝光CaptureRequest.SENSOR\u曝光时间和CaptureRequest.SENSOR\u灵敏度。我认为,在OpenCV获取图像进行处理之前,需要对这些属性进行控制。您可以看到有人在此处尝试了此操作,但也未能成功: