Camera 2 ImageReader деформация предварительного просмотра камеры - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь сканировать штрих-коды PDF417 в режиме реального времени с предварительным просмотром с камеры.

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

Цель состоит в том, чтобы нарисовать рамку идеального размера для предварительного просмотра, чтобы она соответствовала экрану, но чтобы максимально возможное изображение было отправлено в onImageAvailableListener.

Я использую формат YUV_420_888, так как производительность приемлема. Деформация исчезает при использовании формата изображения JPEG, но частота кадров падает примерно до 5-8 кадров в секунду, в то время как на моем Samsung J5 она замораживается на пару секунд.

Когда формат YUV:

Distorted Image

Когда формат JPEG:

Undistored Image

Это настройка дляimagereader;

Size largest = Collections.max(
                Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888)),
                new CompareSizesByArea());

        imageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.YUV_420_888, 2);

Это расчет для поверхности предварительного просмотра. chooseOptimalSize - это мой метод, который выполняет расчеты размера по моему вкусу. Они являются действительными разрешениями, которые исходят от устройства камеры.

previewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), textureView.getHeight(), textureView.getWidth());

SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());

        Surface surface = new Surface(surfaceTexture);
        captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        Surface imageSurface = imageReader.getSurface();

        captureRequestBuilder.addTarget(imageSurface);
        captureRequestBuilder.addTarget(surface);

cameraDevice.createCaptureSession(Arrays.asList(surface, imageSurface), stateCallback, null);

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

...