Android camera2 предварительный просмотр изображения беспорядок при сохранении с помощью ImageReader - PullRequest
0 голосов
/ 25 марта 2019

Я делаю серию снимков с помощью Android Camera2 API для оценки поз в реальном времени и восстановления среды (проблема SLAM). В настоящее время я просто сохраняю все эти изображения на моей SD-карте для автономной обработки.

Я настроил конвейер обработки в соответствии с Camera2Basic от Google, используя TextureView, а также ImageReader, где они оба установлены в качестве целевых поверхностей для повторного запроса предварительного просмотра.

mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mIsShooting){
                    try {
                        mCaptureSession.stopRepeating();
                        mPreviewRequestBuilder.removeTarget(mImageReader.getSurface());
                        mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
                        mIsShooting = false;
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }
                else{
                    try {
                        mCaptureSession.stopRepeating();
                        mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
                        mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
                        mIsShooting = true;
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

ImageReader добавляется / удаляется при нажатии кнопки. ImageReader OnImageAvailableListener реализован следующим образом:

private ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            Image img = reader.acquireLatestImage();
            if(null == img){
                return;
            }
            if(img.getTimestamp() <= mLatestFrameTime){
                Log.i(Tag, "disorder detected!");
                return;
            }
            mLatestFrameTime = img.getTimestamp();
            ImageSaver saver = new ImageSaver(img, img.getTimestamp());
            saver.run();
        }
    };

Я использую acquireLatestImage (с размером буфера, установленным в 2), чтобы удалить старые кадры, а также проверил временную метку изображения, чтобы убедиться, что они монотонно увеличиваются.

Считыватель получает изображения с приемлемой скоростью (около 25 кадров в секунду). Однако более внимательный взгляд на сохраненную последовательность изображений показывает, что они не всегда сохраняется в хронологическом порядке.

Следующие изображения взяты из длинного эпизода, снятого программой (извините за невозможность публикации изображений напрямую :():

Изображение 1:

https://github.com/thuliangjz/openfile/blob/master/pic01218.jpg

Изображение 2:

https://github.com/thuliangjz/openfile/blob/master/pic01219.jpg

Изображение 3:

https://github.com/thuliangjz/openfile/blob/master/pic01218.jpg

Такое расстройство встречается не очень часто, но может возникнуть в любое время и, похоже, не является проблемой инициализации. Я предполагаю, что это как-то связано с размером буфера ImageReader, так как при увеличении размера буфера происходит меньше «обратных возвратов». У кого-нибудь есть такая же проблема?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я, наконец, обнаружил, что такой беспорядок исчезает при установке формата ImageReader равным YUV_420_888 в его конструкторе. Первоначально я установил это поле как JPEG.

Использование формата JPEG влечет за собой не только большую задержку обработки, но и беспорядок. Я предполагаю, что преобразование данных датчика изображения в желаемый формат использует другое оборудование, такое как DSP или GPU, которое не гарантирует хронологический порядок.

0 голосов
/ 26 марта 2019

Используете ли вы TEMPLATE_STILL_CAPTURE для запросов на захват при включении ImageReader или просто TEMPLATE_PREVIEW? С какими устройствами вы видите проблемы?

Если вы используете STILL_CAPTURE, убедитесь, что вы проверили, поддерживает ли устройство флаг ENABLE_ZSL , и установите для него значение false. Если для него установлено значение true (как правило, по умолчанию на устройствах, которые его поддерживают, для шаблона STILL_CAPTURE), изображения могут возвращаться не по порядку, поскольку в устройстве камеры имеется очередь с нулевым запуском.

...