Я реализую приложение, которое использует обработку изображений в реальном времени на живые изображения с камеры. Он работал с ограничениями, используя теперь устаревшую android.hardware.Camera; для повышения гибкости & Производительность Я бы хотел использовать новый API android.hardware.camera2. Однако у меня возникают проблемы с получением необработанных данных изображения. Это на Samsung Galaxy S5. (К сожалению, у меня нет другого устройства Lollipop, пригодного для тестирования на другом оборудовании).Данные изображения из камеры Android2 API перевернуты и склеены на Galaxy S5
Я получил общую структуру (с вдохновением от образцов «HdrViewFinder» и «Camera2Basic»), а живое изображение рисуется на экране через SurfaceTexture и GLSurfaceView. Тем не менее, мне также необходимо получить доступ к данным изображения (оттенки серого только прекрасны, по крайней мере на данный момент) для пользовательской обработки изображений. Согласно документации к StreamConfigurationMap.isOutputSupportedFor(class), рекомендуемая поверхность для получения данных изображения напрямую будет ImageReader (правильно?).
Так я создал мои запросы захвата, как:
mSurfaceTexture.setDefaultBufferSize(640, 480);
mSurface = new Surface(surfaceTexture);
...
mImageReader = ImageReader.newInstance(640, 480, format, 2);
...
List<Surface> surfaces = new ArrayList<Surface>();
surfaces.add(mSurface);
surfaces.add(mImageReader.getSurface());
...
mCameraDevice.createCaptureSession(surfaces, mCameraSessionListener, mCameraHandler);
и в onImageAvailable обратного вызова для ImageReader, я доступ к данным следующим образом:
Image img = reader.acquireLatestImage();
ByteBuffer grayscalePixelsDirectByteBuffer = img.getPlanes()[0].getBuffer();
... но пока (как сказано), просмотр живого изображения работает, что-то не так с данными, которые я получаю здесь (или с тем, как я его получаю). Согласно
mCameraInfo.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputFormats();
... следующие ImageFormats должны быть поддержаны: NV21, JPEG, YV12, YUV_420_888. Я пробовал все (подключено к «формату» выше), все они поддерживают разрешение набора в соответствии с getOutputSizes(format)
, но ни один из них не дают желаемый результат:
- NV21: ImageReader.newInstance броски java.lang.IllegalArgumentException : Формат NV21 не поддерживается
- JPEG: Это действительно работает, но для приложения в реальном времени не имеет смысла пропускать JPEG-кодирование и декодировать для каждого кадра ...
- YV12 и YUV_420_888: это самый странный результат - я вижу изображение полутонового изображения, но оно перевернуто вертикально (да, перевернуто, не повернуто!) и значительно squished (масштабируется значительно горизонтально, но не вертикально).
Что мне здесь не хватает? Что заставляет изображение переворачиваться и сжиматься? Как я могу получить геометрически корректный буфер оттенков серого? Должен ли я использовать другой тип поверхности (вместо ImageReader)?
Любые намеки приветствуются.
Когда вы добавляете две цели для работы с необработанными кадрами, вы постоянно получаете кадры. Я также обновляю свое приложение на Api 2, но оно зависает от приложения с добавлением двух выходных целевых объектов. mPreviewRequestBuilder.addTarget (поверхность); mPreviewRequestBuilder.addTarget (mImageReader.getSurface()); – user1154390