Получить растровое изображение без преобразований из TextureView

В настоящее время я разрабатываю приложение, использующее 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 (что логично), а мне нужно изображение целиком.

Является ли это возможным ?

Спасибо, НиКЛО


person NiCLO    schedule 26.02.2016    source источник


Ответы (2)


Вы можете отправлять кадры в созданный вами SurfaceTexture, а не в тот, который является частью TextureView, а затем получать пиксели, визуализируя их в pbuffer GLES и считывая их обратно с помощью glReadPixels().

Если вы можете работать в YUV, а не в RGB, вы можете получить данные быстрее и проще, направив вывод Camera2 на Чтение изображений.

Grafika содержит несколько полезных примеров, например. "текстура с камеры".

person fadden    schedule 26.02.2016

Для меня следующая реализация отлично работает для меня:

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

Полная реализация для Camera API2 и NDK (OpenCV) здесь: https://stackoverflow.com/a/49331546/471690

person Hpsaturn    schedule 17.03.2018
comment
getBitmap возвращает полное изображение, которое камера видела на некоторых устройствах, а на других устройствах оно возвращает переведенное изображение, которое вы видите в вашем TextureView... теперь возникла эта проблема, так что это не решение, поскольку он просто получает растровое изображение из представления текстуры - person AngryDuck; 08.05.2019