Android zeichnen auf Kamera Vorschau

8

Ich mache eine Virtual-Reality-Anwendung, bei der die Kamera Gesichter erkennen, sie lokalisieren und ihre Position in der Kameravorschau anzeigen soll.

Ich kenne drei Möglichkeiten, wie ich es machen kann. Ich möchte GLSurfaceView so schnell wie möglich nutzen ( entsprechend diesem Beitrag) ), aber momentan versuche ich, auf die selbe SurfaceView zu zeichnen, wo die Kamera für ihre Vorschau verwendet wird. Mein Rückruf, um darauf zu zeichnen, wäre onFaceDetection so:

%Vor%

Mit diesem Code bekomme ich immer diesen Fehler:

%Vor%

Besteht ein Problem damit, dass die Kamera versucht, ihre Vorschau auf denselben SurfaceView-Gesichtserkennungs-Callback zu zeichnen? Wie kann ich dies tun, ohne SurfaceViews zu schichten?

    
Solenoid 03.09.2012, 18:22
quelle

4 Antworten

6

Sie können nicht auf einer SurfaceView mit Type.PUSH_BUFFERS (der Frame, in dem Sie Frames anzeigen) suchen. Sie müssen eine andere Ansicht über die ursprüngliche in Z-Richtung erstellen und auf eine SurfaceView in dieser Ansicht zeichnen.

Erstellen Sie in Ihrer main.xml eine benutzerdefinierte Ansicht unterhalb Ihrer ursprünglichen Ansicht in einem FrameLayout.

Erstellen und behandeln Sie eine SurfaceView in Ihrer Aktivitätsansicht. Fügen Sie diese Ansicht der Kameravorschau hinzu. Starten Sie Ihre benutzerdefinierte Ansicht, indem Sie den SurfaceHolder übergeben. In dieser Ansicht können Sie auf einer Zeichenfläche sperren und zeichnen.

    
James Burnstone 24.09.2012, 12:38
quelle
5

Wie James darauf hingewiesen hat, müssen Sie eine benutzerdefinierte Oberfläche erstellen, die SurfaceView erweitert (ich implementiere normalerweise auch SurfaceHolder.Callback):

public class CameraSurfacePreview extends SurfaceView implements SurfaceHolder.Callback

Konstruktor wird etwa so aussehen:

%Vor%

Sie müssen die Kamera nach dem Öffnen der Kamera mit Ihrer Oberfläche verbinden (wenn Sie implementiert SurfaceHolder.Callback implementiert dies irgendwo in überschriebene Oberfläche einfügen):

%Vor%

Schließlich müssen Sie eine Instanz Ihrer benutzerdefinierten Oberfläche in der Aktivitätsansicht hinzufügen:

%Vor%

In meinem Beispiel sieht das Layout für Aktivitäten ungefähr so ​​aus (Ich zeige eine Kameravorschau im Layout des Hauptfensters):

%Vor%     
Igor 26.09.2012 17:23
quelle
0

Die Methode lockcanvas / unlockcanvasandpost ist nicht geeignet, wenn openGL verwendet wird, da der openGL-Code die Oberfläche steuert und sperrt. Wenn Sie die Standard-2d-APIs verwenden möchten, verwenden Sie nicht OpenGL.

    
Sebastian Breit 27.09.2012 15:49
quelle
-1

Ich könnte sagen,

Es geht nicht um einen Thread.

Es ist nicht wegen dieser Zeile, die Fehler entweder machen.

%Vor%

Weil die Leinwand immer noch verwendet wird und nicht gesperrt werden kann

Wenn Sie dies sorgfältig prüfen, sehen Sie, dass diese Arbeitsfläche "is == null

" ist %Vor%

Sie könnten dann eine Frage haben, wo sie bereits verwendet wird?

Es wird bereits verwendet, um anzuzeigen, was dir vorgeht! Das ist

%Vor%

Also, ich schlage vor, Wenn Sie einen Punkt über Ihr Auge zeichnen möchten, müssen Sie möglicherweise einen anderen SurfaceView / SurfaceHolder über Ihrer SurfaceView für die Vorschau-Kamera haben:]

    
Sruit A.Suk 26.09.2012 03:25
quelle