surface for openCV with Android: already connected

Viewed 1175

I'm trying to connect my Android app with the OpenCV library and I need to use a native camera for have more control of the camera options. For do it I have found http://nezarobot.blogspot.it/2016/03/android-surfacetexture-camera2-opencv.html, that is what I need. My problem is that if I use this code, with some small change and when I launch it, my app crash with 3 errors reported:

  • E/BufferQueueProducer: [SurfaceTexture-0-31525-0] connect(P): already connected (cur=4 req=2)
  • D/PlateNumberDetection/DetectionBasedTracker: ANativeWindow_lock failed with error code -22
  • A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x315e9858 in tid 31735 (CameraBackgroun)

I have tried to close the camera before the jni call and I can capture and show only the first frame, but then I need to restart the camera and I can't create the same thread by itself.

Here I take the frame and I send to NDK.

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

    @Override
    public void onImageAvailable(ImageReader reader) {

        Image image;

        try {
            image = reader.acquireLatestImage();
            if( image == null) {
                return;
            }



            if (image.getFormat() != ImageFormat.YUV_420_888) {
                throw new IllegalArgumentException("image must have format YUV_420_888.");
            }

            Image.Plane[] planes = image.getPlanes();

            if (planes[1].getPixelStride() != 1 && planes[1].getPixelStride() != 2) {
                throw new IllegalArgumentException(
                        "src chroma plane must have a pixel stride of 1 or 2: got "
                                + planes[1].getPixelStride());
            }

            mNativeDetector.detect(image.getWidth(), image.getHeight(), planes[0].getBuffer(), surface);


        } catch (IllegalStateException e) {
            Log.e(TAG, "Too many images queued for saving, dropping image for request: ", e);
            return;
        }
        image.close();
    }
};

and here I manage the camera preview

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

        BlockingSessionCallback sessionCallback = new BlockingSessionCallback();

        List<Surface> outputSurfaces = new ArrayList<>();
        outputSurfaces.add(mImageReader.get().getSurface());
        outputSurfaces.add(new Surface(textureView.getSurfaceTexture()));

        cameraDevice.createCaptureSession(outputSurfaces, sessionCallback, mBackgroundHandler);

        try {
            Log.d(TAG, "waiting on session.");
            cameraCaptureSessions = sessionCallback.waitAndGetSession(SESSION_WAIT_TIMEOUT_MS);
            try {
                captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);


                Log.d(TAG, "setting repeating request");

                cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(),
                        mCaptureCallback, mBackgrounHandler);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        } catch (TimeoutRuntimeException e) {
            Toast.makeText(AydaMainActivity.this, "Failed to configure capture session.", Toast.LENGTH_SHORT);
        }

    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}
1 Answers

Have you tried that code without your "some small change" first? I have tried that project and it worked well on multiple devices. So it will be useful to first establish if it does not work on your phone at all, or if there is a problem in your modifications.

Related