Я пытаюсь сканировать штрих-коды PDF417 в режиме реального времени с предварительным просмотром с камеры.
У меня возникла проблема, когда основная поверхность из вида текстуры, используемого для предварительного просмотра камеры, и поверхность считывателя изображений имеют разныеРазрешения это исказит предварительный просмотр в представлении текстуры. Удаление поверхности считывателя снимает деформацию предварительного просмотра.
Цель состоит в том, чтобы нарисовать рамку идеального размера для предварительного просмотра, чтобы она соответствовала экрану, но чтобы максимально возможное изображение было отправлено в onImageAvailableListener.
Я использую формат YUV_420_888, так как производительность приемлема. Деформация исчезает при использовании формата изображения JPEG, но частота кадров падает примерно до 5-8 кадров в секунду, в то время как на моем Samsung J5 она замораживается на пару секунд.
Когда формат YUV:
Когда формат JPEG:
Это настройка для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);
Я знаю, что это возможно, поскольку я видел, как он работает при сканировании идентификатора микроблинкаприложение. Я просто не могу понять, как предотвратить искажения или проблемы с частотой кадров. Любая помощь будет оценена.