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%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).
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:
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:
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):