Es ist eine Fortsetzung vom letzten Mal (Teil 1 Gesichtserkennung). Überschreiben Sie das zuvor erkannte Gesicht mit einem anderen Bild. Ich habe auf die folgende Seite verwiesen. Bildverarbeitung mit Python + Opencv 5 (Größe ändern) Lachenden Mann im Gesicht mit Python + OpenCV + Kissen überschreiben
Das zu überschreibende Bild ist schließlich dieses. Lachende Männerteile
Da die Größe des erkannten Gesichts und die Größe des zu überschreibenden Bildes unterschiedlich sind, erstellen Sie mit der Funktion resize () von OpenCV eine Funktion zum Ändern der Bildgröße. Wenn Sie das Bild und die geänderte Größe angeben, wird es entsprechend erweitert und verkleinert. Ich wollte das Seitenverhältnis des Originalbilds nicht ändern, daher wird es entsprechend dem kleineren Größenunterschied (Verhältnis) erweitert und verkleinert. Unten ist der Code.
resize_image
def resize_image(image, height, width):
#Holen Sie sich die Originalgröße
org_height, org_width = image.shape[:2]
#Schrumpfen, um der größeren Größe zu entsprechen
if float(height)/org_height > float(width)/org_width:
ratio = float(height)/org_height
else:
ratio = float(width)/org_width
#Größe ändern
resized = cv2.resize(image,(int(org_height*ratio),int(org_width*ratio)))
return resized
Lassen Sie uns die Größenänderungsfunktion testen. Ich habe versucht, es 100 x 100 groß zu machen.
resizetest
#Laden des Bildes zum Überschreiben
ol_imgae_path = "target/warai_otoko.png "
ol_image = cv2.imread(ol_imgae_path,cv2.IMREAD_UNCHANGED) #Alpha-Kanal(Transparent)IMREAD zu lesen_Geben Sie INCHANGED an
#Größe ändern
resized_image = resize_image(ol_image, 100, 100)
#Ausgabe des Erkennungsergebnisses
cv2.imwrite("result/warai_otoko_result.png ", resized_image)
Before
After
Ich konnte es erfolgreich reduzieren.
Überschreiben Sie das Bild auf dem Gesichtsteil. Erstellen Sie eine Funktion, die ein Bild an einer bestimmten Position mithilfe einer Bibliothek namens Pillow (PIL) synthetisiert. Der Fluss ist -Konvertieren Sie Bilder vom OpenCV-Format in das PIL-Format ・ Mit Overlay-Bild überschreiben
overlayOnPart
import numpy as np
from PIL import Image
def overlayOnPart(src_image, overlay_image, posX, posY):
#Ermitteln Sie die Größe des Überlagerungsbilds
ol_height, ol_width = overlay_image.shape[:2]
#Konvertieren Sie OpenCV-Bilddaten in PIL
#Konvertieren Sie von BGRA zu RGBA
src_image_RGBA = cv2.cvtColor(src_image, cv2.COLOR_BGR2RGB)
overlay_image_RGBA = cv2.cvtColor(overlay_image, cv2.COLOR_BGRA2RGBA)
#In PIL konvertieren
src_image_PIL=Image.fromarray(src_image_RGBA)
overlay_image_PIL=Image.fromarray(overlay_image_RGBA)
#Wechseln Sie zum Compositing in den RGBA-Modus
src_image_PIL = src_image_PIL.convert('RGBA')
overlay_image_PIL = overlay_image_PIL.convert('RGBA')
#Bereiten Sie einen transparenten Campus derselben Größe vor
tmp = Image.new('RGBA', src_image_PIL.size, (255, 255,255, 0))
#Überschreiben Sie den vorbereiteten Campus
tmp.paste(overlay_image_PIL, (posX, posY), overlay_image_PIL)
#Kombinieren Sie Original und Campus und speichern Sie
result = Image.alpha_composite(src_image_PIL, tmp)
return cv2.cvtColor(np.asarray(result), cv2.COLOR_RGBA2BGRA)
Ich werde einen lachenden Mann auf das Gesicht des Lenna-Bildes setzen, das ich das letzte Mal erkannt habe. Das Laden von Bildern zum Überschreiben der vorherigen Quelle wurde hinzugefügt. Überschreiben Sie das Gesicht, nachdem Sie es verkleinert haben, um es an die Größe des Gesichts anzupassen.
overlay_face
#coding=utf-8
import cv2
import numpy as np
from PIL import Image
def overlay_face():
#Lesen der erkannten Datei
image_path = "target/Lenna.png "
image = cv2.imread(image_path)
#Laden des Bildes zum Überschreiben
ol_imgae_path = "target/warai_otoko.png "
ol_image = cv2.imread(ol_imgae_path,cv2.IMREAD_UNCHANGED) #Alpha-Kanal(Transparent)IMREAD zu lesen_Geben Sie INCHANGED an
#In Graustufen konvertieren
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#Dateispezifikation des Funktionsumfangs für die Gesichtserkennung
cascade_path = "haarcascades/haarcascade_frontalface_alt.xml"
#Ermitteln Sie die Merkmalsmenge des Kaskadenklassifikators
cascade = cv2.CascadeClassifier(cascade_path)
#Gesichtserkennung durchführen
facerecog = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
if len(facerecog) > 0:
#Überschreiben Sie das Bild auf allen erkannten Gesichtern
for rect in facerecog:
#Erkennungsergebnis anzeigen
print ("Erkennungsergebnis")
print ("(x,y)=(" + str(rect[0]) + "," + str(rect[1])+ ")" + \
"Höhe:"+str(rect[2]) + \
"Breite:"+str(rect[3]))
#Passen Sie die Bildgröße an den Erkennungsbereich an
resized_ol_image = resize_image(ol_image, rect[2], rect[3])
#Erstellen eines überschriebenen Bildes
image = overlayOnPart(image, resized_ol_image, rect[0], rect[1])
#Ausgabe des Erkennungsergebnisses
cv2.imwrite("result/Lenna_result.png ", image)
if __name__ == '__main__':
overlay_face()
Es ging gut.
Jetzt, da Sie ein Standbild in Photoshop erstellen können, Ab dem nächsten Mal werde ich es auf Videos anwenden. Verschiedene Photoshop-Videos mit Python + OpenCV erstellen ③ Verschiedene Photoshop-Videos erstellen
Recommended Posts