Wie png mit Alpha / Transparenz in einem Frame in Echtzeit beizutreten

8

Ich arbeite am Beispiel von OpenCV android 2.4.11, das Gesichter mit der Kamera erkennt. Anstatt ein Rechteck auf das gefundene Gesicht zu zeichnen, versuche ich eine Maske (PNG-Bild) auf das Gesicht zu legen. Aber um das Bild auf dem Gesicht anzuzeigen, kommt das PNG-Bild mit einem schwarzen Hintergrund, wo es Transparenz gab.

FdActivity.java

%Vor%     
VTR2015 28.04.2016, 17:23
quelle

1 Antwort

13

Hinweis: Ich werde das allgemeine Prinzip erklären und Ihnen eine Beispielimplementierung in Python geben, da ich die Android Entwicklungsumgebung nicht eingerichtet habe. Es sollte ziemlich einfach sein, dies nach Java zu portieren. Fühlen Sie sich frei, Ihren Code als separate Antwort zu veröffentlichen.

Sie müssen etwas Ähnliches tun wie die Operation addWeighted , also die Operation

In Ihrem Fall muss α jedoch eine Matrix sein (d. h. wir benötigen einen anderen Mischkoeffizienten pro Pixel).

Beispielbilder

Lassen Sie uns einige Beispielbilder verwenden, um dies zu veranschaulichen. Wir können das Lena-Bild als Musterfläche verwenden:

Dieses Bild als Overlay mit Transparenz:

Und dieses Bild als Overlay ohne Transparenz:

Mischmatrix

Um die alpha -Matrix zu erhalten, können wir entweder die Vordergrund- (Overlay-) und Hintergrundmaske (das Gesicht) mithilfe der Schwellenwertfunktion bestimmen oder den Alpha-Kanal aus dem Eingabebild verwenden, sofern dieser verfügbar ist / p>

Es ist nützlich, dies bei Gleitkommabildern mit Werten im Bereich von 0.0 .. 1.0 durchzuführen. Wir können dann die Beziehung zwischen den beiden Masken als

ausdrücken %Vor%

d. Die beiden Masken addieren sich zu Einsen.

Für das Overlay-Bild im RGBA-Format erhalten wir die folgenden Vordergrund- und Hintergrundmasken:

Wenn wir beim RGB-Format Schwellwertbildung, Erodierung und Unschärfe verwenden, erhalten wir die folgenden Vorder- und Hintergrundmasken:

Gewichtete Summe

Jetzt können wir zwei gewichtete Teile berechnen:

%Vor%

Beim RGBA-Overlay sehen die Vorder- und Hintergrundteile wie folgt aus:

Und für RGB-Overlay sehen die Vordergrund- und Hintergrundteile wie folgt aus:

Und schließlich fügen Sie sie zusammen, und konvertieren Sie das Bild zurück in 8bit Ganzzahlen im Bereich 0-255.

Das Ergebnis der Operationen sieht folgendermaßen aus (RGBA- bzw. RGB-Überlagerung):

Codebeispiel - RGB-Überlagerung

%Vor%

Codebeispiel - RGBA-Überlagerung

%Vor%     
Dan Mašek 12.05.2016 21:54
quelle

Tags und Links