Wdrażam aplikację, która wykorzystuje przetwarzanie obrazu w czasie rzeczywistym na żywo z aparatu. To działa, z ograniczeniami, używając teraz przestarzałego android.hardware.Camera; dla większej elastyczności & wydajność Chciałbym użyć nowego API android.hardware.camera2. Mam problemy z uzyskaniem danych obrazu surowego do przetworzenia. To jest na Samsung Galaxy S5. (Niestety, nie mam innego urządzenia Lollipop do przetestowania na innym sprzęcie).Dane obrazu z kamery Android2 API przerzucone i zgniecione na urządzeniu Galaxy S5
Mam ogólne ramy (z inspiracji z próbek "HdrViewFinder" i "Camera2Basic"), a obraz na żywo rysowany jest na ekranie za pomocą SurfaceTexture i GLSurfaceView. Muszę jednak uzyskać dostęp do danych obrazu (tylko skala szarości wystarcza, przynajmniej na razie) do niestandardowego przetwarzania obrazu. Zgodnie z dokumentacją pod numerem StreamConfigurationMap.isOutputSupportedFor(class) zalecaną powierzchnią do bezpośredniego uzyskania danych obrazu byłaby ImageReader (poprawna?).
Więc mam skonfigurować moje prośby uchwycić jak:
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);
aw onImageAvailable zwrotnego dla ImageReader, mam dostęp do danych w następujący sposób:
Image img = reader.acquireLatestImage();
ByteBuffer grayscalePixelsDirectByteBuffer = img.getPlanes()[0].getBuffer();
... ale chociaż (jak powiedziano) działa podgląd obrazu na żywo, coś jest nie tak z danymi, które tu dostaję (lub sposobem, w jaki je dostaję). Według
mCameraInfo.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputFormats();
... być obsługiwane następujące ImageFormats powinien: NV21, JPEG, YV12, YUV_420_888. Próbowałem wszystkich (podłączony do „formatu” powyżej), wszystkie obsługują rozdzielczość ustawiona zgodnie getOutputSizes(format)
, ale żaden z nich nie dać pożądanego rezultatu:
- NV21: ImageReader.newInstance rzuca java.lang.IllegalArgumentException : Format NV21 nie jest obsługiwany
- JPEG: To działa, ale nie wydaje się, aby aplikacja działająca w czasie rzeczywistym przechodziła kodowanie i dekodowanie JPEG dla każdej klatki ...
- YV12 i YUV_420_888: to jest najdziwniejszy wynik - widzę obraz w skali szarości, ale jest on odwrócony pionowo (tak, odwrócony, nie obrócony!) i znacząco zgnieciony (skalowany znacznie w poziomie, ale nie pionowo).
Czego mi tu brakuje? Co powoduje, że obraz jest odwracany i zgniatany? Jak mogę uzyskać geometrycznie poprawny bufor skali szarości? Czy powinienem używać innego rodzaju powierzchni (zamiast ImageReadera)?
Wszelkie wskazówki są mile widziane.
Po dodaniu dwóch obiektów Target do obróbki ramek nieprzetworzonych, otrzymujesz nieprzerwanie ramki. Aktualizuję też moją aplikację na Api 2, ale zamarza ona aplikację dodając dwa wyjściowe cele. mPreviewRequestBuilder.addTarget (powierzchnia); mPreviewRequestBuilder.addTarget (mImageReader.getSurface()); – user1154390