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.
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.
#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.
#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.
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.
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.
if __name__ == '__main__':
main()
#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
Bei Verwendung mit Zoom sieht es so aus. Sie können Ihr nerdiges Gesicht mit einem Twitter-Symbol verbergen und ein Meeting abhalten.
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