2016-03-27 15 views
2

Ich benutze Google APIs für Gesichtserkennung in Android. Wenn ein Gesicht erkannt wird, zeichne ich ein Bild auf die Leinwand. Ich versuche, das Bild mit dem Overlay zu erfassen, indem ich auf eine Schaltfläche klicke. In der Methode public void onPictureTaken(byte[] bytes) enthalten die Bytes nur das Bild ohne die Überlagerung. Gibt es eine Möglichkeit, das Bild mit dem Overlay darauf zu speichern?Wie speichert man ein Bild mit einem Overlay in CameraSource von Google APIs für Android?

+0

ich aus der Klasse GraphicOverlay mit 'this.getDrawingCache() das Overlay erhalten spiegeln;', aber es gibt immer die gleiche Überlagerung zurück. Zum Beispiel, wenn ich das Overlay ändere, gibt es immer das erste Overlay zurück. Wenn das Bild aufgenommen wird, wird es gedreht, manchmal für 90, manchmal für -90 Grad. Die Überlagerung, die ich bekomme, ist in der richtigen Position, also wenn ich es über das Bild stelle, sieht es nicht richtig aus. – user6120360

+1

Beachten Sie, dass es drei verschiedene Koordinatensysteme gibt, die Sie verwalten müssen: (1) Vorschaubildkoordinaten - dies sind die vom Gesichtsdetektor angegebenen Koordinaten, (2) Zeichenleinwandkoordinaten - dies sind die Koordinaten, die zum Zeichnen des Overlays verwendet werden (3) Bildkoordinaten - unterscheidet sich von Vorschau, dass es wahrscheinlich höhere Auflösung ist. Beachten Sie auch, dass bei Verwendung der Frontkamera die Vorschau/Überlagerung horizontal gedreht wird (ein Spiegelbild). – pm0733464

+0

Wie bekomme ich das richtige Overlay, wenn die Schaltfläche erfasst wird? – user6120360

Antwort

0

Sie müssen

  • eine neue Leinwand durch eine neue Bitmap-backed erstellen,

    Bitmap picture = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
    Bitmap resizedBitmap = Bitmap.createBitmap(mGraphicOverlay.getWidth(),mGraphicOverlay.getHeight(),picture.getConfig()); 
    Canvas canvas = new Canvas(resizedBitmap); 
    
  • das erfasste Bitmap zeichnen darüber

  • die Overlays darüber
  • ziehen neue Bitmap speichern

Auch für die Overlays, um das Bild oder das Overlay benötigen Sie entweder das aufgenommene Bild entsprechen

Matrix matrix = new Matrix(); 

matrix.setScale((float)resizedBitmap.getWidth()/(float)picture.getWidth(),(float)resizedBitmap.getHeight()/(float)picture.getHeight()); 

// mirror by inverting scale and translating 
matrix.preScale(-1, 1); 
matrix.postTranslate(canvas.getWidth(), 0); 

Paint paint = new Paint(); 
canvas.drawBitmap(picture,matrix,paint); 

tracker.getmEyesGraphic().draw(canvas); // make those accessible 
+0

Was ist der Tracker in der letzten Zeile? –