[PYTHON] ZOOM, indem Sie Ihr Gesicht durch ein Twitter-Symbol mit openCV-Gesichtserkennung ersetzen

Dies ist kimo_0tak, der erste Beitrag seit langer Zeit. Sie können leicht schönes Fleisch mit Facerig usw. machen, aber ich konnte keinen Weg finden, nur mein Gesicht durch ein anderes Bild zu ersetzen, selbst wenn ich gegoogelt habe, also habe ich es schnell gemacht. Es gibt keine Garantie dafür, dass das Gesicht zu 100% ersetzt wird. Verwenden Sie es daher bitte als Innenringmaterial.

Das angezeigte Bild sieht folgendermaßen aus. ANf8EAbN.png

Die Nutzungsumgebung ist Windows 10, Python 3.6.5. Fügen Sie das Bild, das Sie durch dieses Programm ersetzen möchten, und die XML-Datei des Gesichtserkennungsmodells in dieselbe Datei ein.

Hier ist die Seite, die ich als Referenz verwendet habe.

Gesichtserkennung mit Haar Cascades http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html Zeichnen Sie mit OpenCV ein weiteres Bild über das Bild https://note.com/npaka/n/nddb33be1b782 Eine Geschichte über das Erfassen, Verarbeiten und Anzeigen von Webkamerabildern mit Python + OpenCV https://ensekitt.hatenablog.com/entry/2017/12/19/200000

Lass es uns machen. Der fertige Code befindet sich unten. Wenn Sie also so viel sehen möchten, scrollen Sie nach unten.


Erforderliche Bibliotheken importieren
#OpenCV-Import
import cv2
import numpy as np
from PIL import Image

Wenn Sie Bibliotheken haben, die Sie nicht installiert haben, installieren Sie diese bitte selbst. Öffnen Sie eine Eingabeaufforderung

pip install opencv-python
pip install numpy
pip install Pillow

Sie sollten es durch Eingabe eingeben können.

Verschiedene Einstellungen
#Einstellungen für die Kameraauflösung
WIDTH = 1920
HEIGHT = 1080

#Angabe des zu lesenden Bildes
img = "vtuber_may.jpg "
cv2_img = cv2.imread(img, cv2.IMREAD_UNCHANGED)

#Bezeichnung des Gesichtserkennungsmodells
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')

#Sie können die Kamera mit dem Argument auswählen.
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)

Sie können einen kaskadierenden Klassifikator für die Gesichtserkennung selbst erstellen, dies war jedoch problematisch. Daher habe ich den von Opencv bereitgestellten Klassifikator verwendet. Es ist enthalten, wenn Sie opencv mit pip install opencv installieren. In meiner Umgebung befand es sich im Ordner C: \ Benutzer \ {Benutzername} \ AppData \ Local \ Programme \ Python \ Python36-32 \ Lib \ site-packages \ cv2 \ data.


Funktion zum Synthetisieren von Bildern
def overlayImage(src, overlay, location, size):
    overlay_height, overlay_width = overlay.shape[:2]

    #Konvertieren Sie Webkamerabilder in das PIL-Format
    src = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
    pil_src = Image.fromarray(src)
    pil_src = pil_src.convert('RGBA')

    #Konvertieren Sie das Bild, das Sie kombinieren möchten, in das PIL-Format
    overlay = cv2.cvtColor(overlay, cv2.COLOR_BGRA2RGBA)
    pil_overlay = Image.fromarray(overlay)
    pil_overlay = pil_overlay.convert('RGBA')
    #Passen Sie die Größe an die Größe Ihres Gesichts an
    pil_overlay = pil_overlay.resize(size)

    #Bilder kombinieren
    pil_tmp = Image.new('RGBA', pil_src.size, (255, 255, 255, 0))
    pil_tmp.paste(pil_overlay, location, pil_overlay)
    result_image = Image.alpha_composite(pil_src, pil_tmp)

    #In das OpenCV-Format konvertieren
    return cv2.cvtColor(np.asarray(result_image), cv2.COLOR_RGBA2BGRA)

Da Opencv keine Bilder synthetisieren kann, erstellen Sie eine Funktion zum Kombinieren von Bildern nach der Konvertierung in das PIL-Format. Ich passe die Größe auch an die Höhe und Breite meines Gesichts an.

Hauptfunktion
def main(): 
    #Eine Variable, die die Koordinaten der oberen linken Ecke der Gesichtserkennung speichert
    x = 0
    y = 0

    #Variable, die die Breite und Höhe des Gesichts speichert
    w = 0
    h = 0
    while True:
        #Laden Sie 1 Frame aus VideoCapture
        ret, frame = cap.read()

        #Konvertieren Sie den Rahmen zur Gesichtserkennung in das graue Format
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        face = face_cascade.detectMultiScale(gray, 1.3, 5)

        #Wenn das Gesicht erkannt wird x, y, w,Update h
        if face != ():
            (x, y, w, h) = face[0]

        #Wenn die Variable nicht der Anfangswert ist, wird das Bild mit dem Rahmen kombiniert
        if w != 0:
            frame = overlayImage(frame, cv2_img, (x, y), (w, h))


        #Zeigen Sie den verarbeiteten Frame an
        cv2.imshow('Frame', frame)

        #Warten Sie 1 ms auf die Tasteneingabe und brechen Sie ab, wenn ESC gedrückt wird
        k = cv2.waitKey(1)
        if k == 27:
            break

    #Geben Sie die Aufnahme frei und schließen Sie das Fenster
    cap.release()
    cv2.destroyAllWindows()

Ein Bild wird von der Webkamera gelesen und das Bild verarbeitet. Je nach Rahmen wird das Gesicht möglicherweise nicht erkannt. Wenn es nicht erkannt wird, wird es mit der zuvor erkannten Position kombiniert. Beachten Sie, dass wenn zwei oder mehr Gesichter auf dem Bildschirm erkannt werden, das Bild nur mit einem der Gesichter kombiniert wird. Ich dachte, ich würde es verbessern, aber ich habe es nicht verbessert, weil es unwahrscheinlich ist, dass beide gleichzeitig in ZOOM erscheinen.

Verarbeitung zur Ausführung der Hauptfunktion
if __name__ == '__main__':
    main()



Zusammenfassend sieht es so aus
#OpenCV-Import
import cv2
import numpy as np
from PIL import Image

#Einstellungen für die Kameraauflösung
WIDTH = 1920
HEIGHT = 1080

#Angabe des zu lesenden Bildes
img = "vtuber_may.jpg "
cv2_img = cv2.imread(img, cv2.IMREAD_UNCHANGED)

#Bezeichnung des Gesichtserkennungsmodells
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')

#Sie können die Kamera mit dem Argument auswählen.
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)

def overlayImage(src, overlay, location, size):
    overlay_height, overlay_width = overlay.shape[:2]

    #Konvertieren Sie Webkamerabilder in das PIL-Format
    src = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
    pil_src = Image.fromarray(src)
    pil_src = pil_src.convert('RGBA')

    #Konvertieren Sie das Bild, das Sie kombinieren möchten, in das PIL-Format
    overlay = cv2.cvtColor(overlay, cv2.COLOR_BGRA2RGBA)
    pil_overlay = Image.fromarray(overlay)
    pil_overlay = pil_overlay.convert('RGBA')
    #Passen Sie die Größe an die Größe Ihres Gesichts an
    pil_overlay = pil_overlay.resize(size)

    #Bilder kombinieren
    pil_tmp = Image.new('RGBA', pil_src.size, (255, 255, 255, 0))
    pil_tmp.paste(pil_overlay, location, pil_overlay)
    result_image = Image.alpha_composite(pil_src, pil_tmp)

    #In das OpenCV-Format konvertieren
    return cv2.cvtColor(np.asarray(result_image), cv2.COLOR_RGBA2BGRA)


def main():
    #Eine Variable, die die Koordinaten der oberen linken Ecke der Gesichtserkennung speichert
    x = 0
    y = 0

    #Variable, die die Breite und Höhe des Gesichts speichert
    w = 0
    h = 0
    while True:
        #Laden Sie 1 Frame aus VideoCapture
        ret, frame = cap.read()

        #Konvertieren Sie den Rahmen zur Gesichtserkennung in das graue Format
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        face = face_cascade.detectMultiScale(gray, 1.3, 5)

        #Wenn das Gesicht erkannt wird x, y, w,Update h
        if face != ():
            (x, y, w, h) = face[0]

        #Wenn die Variable nicht der Anfangswert ist, wird das Bild mit dem Rahmen kombiniert
        if w != 0:
            frame = overlayImage(frame, cv2_img, (x, y), (w, h))


        #Zeigen Sie den verarbeiteten Frame an
        cv2.imshow('Frame', frame)

        #Warten Sie 1 ms auf die Tasteneingabe und brechen Sie ab, wenn ESC gedrückt wird
        k = cv2.waitKey(1)
        if k == 27:
            break

    #Geben Sie die Aufnahme frei und schließen Sie das Fenster
    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

Sie müssen lediglich das von diesem Programm in OBS Studio angezeigte Webkamerabild laden und es als virtuelle Kamera mit virtualcam ausgeben. Ich werde es hier nicht erklären, aber bitte sehen Sie diese Seite usw. und stellen Sie es ein.

Verwendung von VirtualCam zum Erkennen von OBS als virtuelle Kamera https://loumo.jp/archives/24912

43LjUnYe.png Bei Verwendung mit Zoom sieht es so aus. Sie können Ihr nerdiges Gesicht mit einem Twitter-Symbol verbergen und ein Meeting abhalten.

Saigo ni

Ich habe den Code nach und nach veröffentlicht, um den Code näher zu erläutern, aber der größte Teil der Erklärung wurde in den Kommentaren geschrieben, und ich habe nur die Position des Kaskadenklassifikators von opencv mit Ausnahme der Kommentare geschrieben. Außerdem bin ich süchtig nach Shisaki Sion-chan von Holorives vtuber, also schauen Sie bitte mal rein.

Recommended Posts

ZOOM, indem Sie Ihr Gesicht durch ein Twitter-Symbol mit openCV-Gesichtserkennung ersetzen
Gesichtserkennung mit OpenCV von Python
Gesichtserkennung / Schneiden mit OpenCV
Gesichtserkennung mit Kamera mit opencv3 + python2.7
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
[python, openCV] base64 Gesichtserkennung in Bildern
Hallo Welt- und Gesichtserkennung mit OpenCV 4.3 + Python
Gesichtserkennung mit Edison
Einfacher Gesichtserkennungsversuch mit Jetson Nano und Webkamera
Gesichtserkennung durch Amazon Rekognition
Gesichtserkennung mit Python + OpenCV
Versuchen Sie die Gesichtserkennung mit Python
Bilderkennung mit Keras + OpenCV
Anime-Gesichtserkennung mit OpenCV
Leuchtendes Leben mit Python und OpenCV
Neuronales Netzwerk mit OpenCV 3 und Python 3
[OpenCV] Persönliche Identifikation mit Gesichtsfoto
Erste Anime-Gesichtserkennung mit Chainer
Schneiden Sie das Gesicht mit Python + OpenCV aus
Objekterkennung mit openCV durch traincascade
Zeichnen Sie Figuren mit OpenCV und PIL
Gesichtserkennung aus mehreren Bilddateien mit openCV, ausschneiden und speichern
Erstellen Sie mit Python + OpenCV Ihre eigene virtuelle Kamera und wenden Sie Originaleffekte an
Lassen Sie uns ein Bilderkennungsmodell mit Ihren eigenen Daten erstellen und spielen!
Kann in 5 Minuten erledigt werden! Erstellen Sie eine Gesichtserkennungs-API mit Fast API und OpenCV und veröffentlichen Sie sie auf Heroku