1

我目前正在开发一个使用 Camera2 的应用程序。我在缩放和翻译的 TextureView 上显示预览(我只需要显示图像的一部分)。我的问题是我需要分析整个图像。

我的 CameraDevice.StateCallback 中有什么:

@Override
    public void onOpened(CameraDevice camera) {
        mCameraDevice = camera;

        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface surface = new Surface(texture);

        try {
            mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        } catch (CameraAccessException e){
            e.printStackTrace();
        }

        try {
            mCameraDevice.createCaptureSession(Arrays.asList(surface), mPreviewStateCallback, null);
            mPreviewBuilder.addTarget(surfaceFull);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

在我的 SurfaceTextureListener 中:

@Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                my_analyze(mTextureView.getBitmap());
            }
        });
        thread.start();
    }

位图只是我在 TextureView 中看到的(这是合乎逻辑的),但我想要整个图像。

可能吗 ?

谢谢, NiCLO

4

2 回答 2

2

您可以将帧发送到您创建的 SurfaceTexture,而不是 TextureView 的一部分,然后通过将像素渲染到 GLES pbuffer 并使用glReadPixels().

如果您可以使用 YUV 而不是 RGB,则可以通过将 Camera2 输出定向到ImageReader来更快、更简单地获取数据。

Grafika有一些有用的例子,例如“来自相机的纹理”。

于 2016-02-26T16:43:08.660 回答
-1

对我来说,下一个实现对我来说很好:

    Bitmap bitmap = mTextureView.getBitmap(mWidth, mHeight);
    int[] argb = new int[mWidth * mHeight];
    // get ARGB pixels and then proccess it with 8UC4 OpenCV convertion
    bitmap.getPixels(argb, 0, mWidth, 0, 0, mWidth, mHeight);
    // native method (NDK or CMake)
    processFrame8UC4(argb, mWidth, mHeight);

和( )的完整实现在这里:https ://stackoverflow.com/a/49331546/471690Camera API2NDKOpenCV

于 2018-03-17T01:37:56.347 回答