【问题标题】:surface for openCV with Android: already connected带有 Android 的 openCV 表面:已连接
【发布时间】:2017-10-01 18:09:17
【问题描述】:

我正在尝试将我的 Android 应用程序与 OpenCV 库连接起来,我需要使用本机摄像头来更好地控制摄像头选项。为此,我找到了http://nezarobot.blogspot.it/2016/03/android-surfacetexture-camera2-opencv.html,这就是我所需要的。 我的问题是,如果我使用此代码,进行一些小的更改,当我启动它时,我的应用程序崩溃并报告了 3 个错误:

  • E/BufferQueueProducer:[SurfaceTexture-0-31525-0] connect(P):已连接 (cur=4 req=2)
  • D/PlateNumberDetection/DetectionBasedTracker:ANativeWindow_lock 失败,错误代码为 -22
  • A/libc:致命信号 11 (SIGSEGV),代码 1,tid 31735 (CameraBackgroun) 中的故障地址 0x315e9858

我曾尝试在 jni 调用之前关闭摄像头,我只能捕获并显示第一帧,但是我需要重新启动摄像头,我无法自行创建相同的线程。

我在这里取帧并发送到 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();
    }
};

我在这里管理相机预览

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();
    }
}

【问题讨论】:

    标签: android opencv android-ndk java-native-interface android-camera2


    【解决方案1】:

    您是否先尝试过没有“一些小改动”的代码?我已经尝试过该项目,它在多种设备上运行良好。因此,首先确定它是否根本无法在您的手机上运行,​​或者您的修改是否存在问题,这将很有用。

    【讨论】:

    • 感谢您的回答,我没有检查问题是否在我的修改中,但我发现了我的问题,它在 outputSurfaces 上,因为我只需要通过 mImageReader.get()。 createCaptureSession 中的 getSurface()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2018-08-24
    • 2013-02-18
    相关资源
    最近更新 更多