Konvertieren Android-Kamera2 api YUV_420_888 RGB
Ich Schreibe eine app, die die Kamera-feed, wandelt es rgb, um zu tun, einige Bearbeitung.
Es funktioniert auf der alten Kamera-Implementierung, die verwendet NV21 Yuv-format.
Das Problem, das ich habe ist mit dem neuen Yuv-format, YUV_420_888. Das Bild ist nicht mehr richtig konvertiert werden, um RGB-in den neuen Kamera2-Api sendet YUV_420_888 yuv-format statt NV21 (YUV_420_SP) - format.
Kann mir bitte jemand sagen, wie sollte ich konvertieren YUV_420_888 zu RGB?
Dank
- möglich, Duplikat der die Umwandlung YUV->RGB(Image processing)->YUV während onPreviewFrame in android?
- Das ist für die älteren Kamera-Umsetzung, das hilft mir nicht. Danke aber.
- Hat jemand konvertiert YUV_420_888 zu NV21 ( YUV_420_SP)?
- haben Sie obige problem gelöst.
- Meine Lösung nutzt die Medien.Bild als Eingabe und gibt die Bitmap stackoverflow.com/a/35994288/5148048).
- Haben Sie einen Blick auf dieses link ich benutze diese Methode, um mein problem zu lösen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In meinem Ansatz verwende ich OpenCV Mat und Skript aus
https://gist.github.com/camdenfullmer/dfd83dfb0973663a7974
Zuerst konvertieren Sie Ihre YUV_420_888 Bild, um die Matte mit dem code in dem link oben.
*mImage ist mein Bild-Objekt, das ich im ImageReader.OnImageAvailableListener
Wir haben die 1-Kanal-YUV-Mat. Definieren Sie neue Matte für die BGR(nicht RGB noch) Bild:
Ich gerade angefangen zu lernen, OpenCV, so dürfte dies nicht zu sein, 4-Kanal-Matte und stattdessen sein könnte, 3-Kanal, aber es funktioniert für mich.
Ich benutze jetzt konvertieren Farbe-Methode zu ändern, mein yuv-Mat in der bgr Mat.
Nun können wir alle tun, die Bildverarbeitung, wie z.B. das finden der Konturen, Farben, Kreise, usw.. Drucken Bild auf dem Bildschirm, die wir brauchen, um es zu konvertieren in bitmap:
Ich habe alle meine Bild-Verarbeitung in separaten thread, so dass mein Bildansicht, die ich brauche, um dies zu tun auf dem UI-thread.
Kamera2 YUV_420_888 RGB-Mat(opencv) in Java
Haben Sie versucht mit diesem script? Es ist eine Antwort gepostet von yydcdut auf diese Frage
https://github.com/pinguo-yuyidong/Camera2/blob/master/camera2/src/main/rs/yuv2rgb.rs
Ungefähr 10-mal schneller als die genannten "imageToMat"-Funktion oben ist dieser code:
image.getPlanes(0)
) ist eigentlich der volle NV21 direkten Puffer. Es ist selten der Fall.Also lief ich in genau das gleiche problem, wo ich hatte ein code, der nahm den alten YUV_420_SP format, byte[] Daten aus OnPreviewFrame() konvertiert nach RGB.
Schlüssel hier ist, dass die "alten" Daten in das byte[] ist als YYYYYY...CrCbCrCbCrCb, und die "neuen" Daten aus der Kamera2-API gliedert sich in 3 Ebenen: 0=Y, 1=Cb, 2=Cr., von wo erhalten Sie jeweils die byte[]s ist. So alle Sie tun müssen ist, ordnen Sie die neuen Daten als eine einzige array, das entspricht dem 'alten' format, die Sie übergeben können, um Ihre bestehenden toRGB () - Funktionen:
..und jetzt Daten[] formatiert ist, so wie die alten YUV_420_SP.
(hoffe, dass es jemand hilft, obwohl die Jahre vergingen..)
Verwenden Shyam Kumar s Antwort ist nicht die richtige für mein Handy, aber Daniel Więcek ' s Recht ist.Ich Debuggen, finden Sie Flugzeuge[i].getRowStride() ist 1216, Flugzeuge[i].getPixelStride() 2 ist. Während Bild-Breite und Höhe ist sowohl für 1200.
Weil mein Ruf ist 3, so dass ich cann ' T Kommentar, aber post eine Antwort.