Android: Echtzeit-Bildverarbeitung

9

Ich habe eine Anwendung, die eine Kameravorschau ausführt, einige grundlegende Bildverarbeitungsfunktionen für jeden Frame ausführt (z. B. Kantendetektion, Farbwechsel, Bildverzerrung usw.) und den modifizierten Frame auf dem Bildschirm in "Echtzeit" anzeigt. Ähnlich der App "Paper Camera" in Android Market.

Eine Zusammenfassung meines Ansatzes:

1: Erstellen Sie zwei überlappende Ansichten in einem Rahmenlayout:

Eine SurfaceView, die an Camera.setPreviewDisplay () übergeben wird. (Durch das Übergeben von null würde verhindert, dass die Kameravorschau auf einigen Geräten startet - opencv hat dies vor Android 4.0 getan?).

Eine Klasse namens "LiveView", die View erweitert und Camera.PreviewCallBack implementiert. Diese Ansicht empfängt Rahmen von der Kamera und zeigt den Rahmen nach der Modifikation an (z. B. Kantendetektion). Diese Ansicht befindet sich oben auf der SurfaceView.

2: Ich rufe Camera.setPreviewCallbackWithBuffer () auf, damit Frames an mein LiveView gesendet werden

3: Im onPreviewFrame () von LiveView nehme ich den aufgenommenen Frame (byte []), konvertiere von YUV nach RGB und führe Bildverarbeitungsfunktionen aus und rufe postInvalidate () auf (Die YUV2RGB-Konvertierung und das Bild) Verarbeitung erfolgt in nativem Code)

4: In der OnDraw () -Methode von LiveView erstelle ich eine Bitmap aus dem modifizierten RGB-Rahmen (byte []) und zeichne die Bitmap nach Canvas.

Das funktioniert (zwischen 5 fps und 10 fps auf verschiedenen Geräten), aber ich würde gerne hören, wie andere dieses Problem angegangen sind und wie es verbessert werden könnte. Insbesondere:

  • Würde ich irgendeine Leistung erhalten, indem ich GLSurfaceView statt View erweitere, um die LiveView-Klasse zu erstellen?
  • Es klingt sehr ineffizient, wenn für jedes Bild zwei Oberflächen aktualisiert werden. Gibt es eine Alternative?
  • Um dies effizienter zu tun, sollte ich auf die Kamera auf nativem Niveau zugreifen? - Ich glaube, dass OpenCV diesen Ansatz verfolgt?

Vielen Dank

    
user1271673 15.03.2012, 14:01
quelle

1 Antwort

4

Ich habe auch so etwas gemacht. Was ich tue, ist die Kameraansicht zu erweitern. Ich glaube nicht, dass die Kameraansicht für jeden Frame aktualisiert wird, sondern abgerufen wird. Und nur die Ansicht, die Sie geändert haben, müsste aktualisiert werden. OpenCv macht einen besseren Job als die native Kamera. Nach dem Importieren von org.opencv.highgui.VideoCapture können Sie direkt auf die Kamera zugreifen mit:

%Vor%

um mGrayMat in mRgbaMat umzuwandeln: (org.opencv.imgproc.Imgproc)

%Vor%     
cedricliang 15.03.2012 14:47
quelle