Erstellen Sie mit Python + OpenCV Ihre eigene virtuelle Kamera und wenden Sie Originaleffekte an

Eine virtuelle Kamera ist eine Software, die von einem PC als Bildeingabegerät wie eine Webkamera erkannt werden kann. Auf diese Weise können Sie Ihr Lieblingsvideo (nicht die Eingabe von der Frontkamera) auf Videokonferenzsysteme </ b> wie Zoom, WebEx und Meet streamen, die heutzutage häufig verwendet werden.

Eine häufig verwendete virtuelle Kamera ist OBS Studio, die ich häufig verwende (es scheint, dass die virtuelle Kamera seit kurzem als Standard ohne Plug-In verfügbar ist). nicht wahr). Ich möchte es jedoch nicht täglich verwenden, da es extrem schwer ist, weil es viele Funktionen hat. (Die GPU-Nutzungsrate beträgt mit RTX2028 SUPER ungefähr 80%, aber bin es nur ich ...?)

Daher dachte ich, ich könnte selbst eine virtuelle Kamera erstellen und Effekte anwenden, also habe ich verschiedene Versuche und Fehler ausprobiert. Es gibt immer noch einen Fehler unbekannter Ursache, aber ich möchte ihn einführen, weil er funktioniert hat.

Annahme

Dieses System ist für "Windows" vorgesehen. </ b> Aufgrund der Handhabung niedriger Grafikebenen unterscheidet sich die Methode in anderen Betriebssystemen wie "Mac" und "Linux" erheblich. Während meiner Recherche habe ich ein Tool gesehen, das auf einem anderen Betriebssystem verwendet werden kann. Daher möchte ich es vorstellen, aber bitte vertraue ihm nicht, da es nicht überprüft wurde.

Diese Konfiguration

Zunächst möchte ich zu dem Schluss kommen, dass es schwierig war, eine vollständige virtuelle Kamera selbst zu erstellen. Daher habe ich dies erkannt, indem ich die Eingabe meiner eigenen Software an die virtuelle Kamera gesendet habe, die in dem zuvor erwähnten OBS </ b> installiert ist. Hat. Das Konfigurationsdiagramm lautet wie folgt. 構成図.png Um eine vollwertige virtuelle Kamera zu erstellen, müssen Sie grafische APIs auf niedriger Ebene wie die "Direct Show API" untersuchen. Ich fand es interessant, also werde ich es das nächste Mal versuchen.

Implementierung

Holen Sie sich Eingabe und zeigen Sie jeden Frame an

Zunächst werden wir als allgemeine Geschichte "OpenCV" verwenden, um das Bild für jeden Frame aus der Datenquelle zu erfassen und den anzuzeigenden Teil zu implementieren. Da es sich um einen sehr allgemeinen Teil handelt, wird jeder Prozess nur in den Code geschrieben.

import cv2

#Wählen Sie die zu erfassende Datenquelle (Webkamera) aus
cap = cv2.VideoCapture(0)

while True:
    #Holen Sie sich das Bild von jedem Frame
    ret, frame = cap.read()

    #Wenden Sie hier einen Effekt an

    #Bild anzeigen
    #Ich möchte auf einer virtuellen Webkamera anzeigen
    cv2.imshow("Window Name", frame)

    #Zeigen Sie 30 Bilder an und beenden Sie die Anzeige, wenn Sie die Eingabetaste drücken.
    if cv2.waitkey(30) == 13:
        break

#Verarbeitung beenden
cv2.destroyAllWindows()
cap.release()

Jetzt haben Sie den Teil implementiert, der das Bild der Webkamera im Fenster anzeigt. Als nächstes sollten Sie diese Anzeige in die virtuelle OBS-Kamera eingeben.

Senden Sie Informationen an die virtuelle Kamera

Für Windows

Ich werde ein Paket namens pyvirtualcam verwenden. Wie Sie im GitHub-Repository sehen können, können Sie eine Umgebung mit pip mit pip install pyvirtualcam installieren (obwohl das aktuelle Repository Fehler </ b> aufweist und die Quelle neu erstellt wird. Andernfalls können Fehler auftreten. Gegenmaßnahmen hierfür sind am Ende dieses Artikels aufgeführt.)

Dies wird auch auf der obigen Repository-Seite beschrieben. Wenn Sie jedoch bereits über OBS (Virtual Camera) verfügen, müssen Sie dies nicht tun, sondern die virtuelle OBS-Webkamera aktivieren. Es gibt zwei Methoden:

  1. Installieren Sie OBS (es wird ohne Erlaubnis installiert)
  2. Laden Sie nur den Teil der virtuellen Kamera von https://github.com/CatxFish/obs-virtual-cam/releases und im Repository "egsvr32 / n / i: 1" obs-virtualcam \ bin \ 64bit \ obs-virtualsource herunter Geben Sie zum Aktivieren .dll "` ein

Methode 1, aber ich habe es nicht bestätigt. In der jüngsten OBS ist Virtual Camera standardmäßig enthalten, daher denke ich, dass dies in Ordnung ist. Wenn Sie jedoch einen Fehler erhalten, versuchen Sie es bitte mit Methode 2.

Ersetzen Sie nach dem Importieren des Pakets den obigen Code wie folgt.

import cv2
import pyvirtualcam

#Wählen Sie die zu erfassende Datenquelle (Webkamera) aus
cap = cv2.VideoCapture(0)

#Bildgröße vom ersten Frame abrufen
ret, frame = cap.read()
with pyvirtualcam.Camera(width=frame.shape[1], height=frame.shape[0], fps=30, delay=0) as cam:
    while True:
        #Holen Sie sich das Bild von jedem Frame
        ret, frame = cap.read()

        #Wenden Sie hier einen Effekt an

        #Farbraum ändern
        #Aktivieren Sie den α-Kanal und die Reihenfolge in RGB
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)

        #Streamen Sie Bilder zur virtuellen Kamera
        cam.send(frame)

        #Da das Bild nicht mehr auf dem Bildschirm angezeigt wird, warten Sie mit der Funktion pyvirtualcam bis zum nächsten Bild.
        cam.sleep_until_next_frame()

#Verarbeitung beenden
cap.release()

Jetzt können Sie das Bild auf die virtuelle OBS-Kamera streamen. Da es keine Möglichkeit gibt, mit der Tasteneingabe zu enden, beenden Sie bitte mit "Strg + C" usw.

Wenn Sie danach die Webkamera angeben, die auf der Seite des Webkonferenzsystems als "OBS-Kamera" verwendet werden soll, sollte das von diesem Programm erfasste Bild der Webkamera angezeigt werden. In diesem Zustand tropft das Bild von der Webkamera nur, daher wenden wir den Effekt von hier aus an.

Für Mac und Linux (unbestätigt)

Für Mac

Es gab OBS Virtual Camera Mac Plugin. Wenn Sie dies verwenden, können Sie möglicherweise dasselbe wie mit der Windows-Methode tun. Hmm (es wurde in das Repository geschrieben, das in der Windows-Methode geschrieben wurde)

Für Linux

Linux verfügt über eine Bibliothek namens v4l2loopback, mit der sich virtuelle Kameras einfach erstellen lassen. Es gibt viele Python-Wrapper wie pyfakewebcam, die dies verwenden. Ich denke, dass die Verwendung dieser Wrapper die Implementierung erheblich vereinfacht als die von Windows. Ich habe es nicht bestätigt, aber wenn Sie "pyfakewebcam" verwenden möchten, sollten Sie den obigen Code wie folgt ändern.

import cv2
import pyfakewebcam

#Wählen Sie die zu erfassende Datenquelle (Webkamera) aus
cap = cv2.VideoCapture(0)

#Bildgröße vom ersten Frame abrufen
ret, frame = cap.read()
camera = pyfakewebcam.FakeWebcam('/dev/video1', frame.shape[1], frame.shape[0])
while True:
    #Holen Sie sich das Bild von jedem Frame
    ret, frame = cap.read()

    #Wenden Sie hier einen Effekt an

    #Farbraum ändern
    #In RGB-Reihenfolge
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    #Streamen Sie Bilder zur virtuellen Kamera
    camera.schedule_frame(frame)

    #Das Bild wird nicht mehr auf dem Bildschirm angezeigt. Warten Sie also bis zum nächsten Bild (30 fps).
    time.sleep(0.033)

#Verarbeitung beenden
cap.release()

abschließend

Ich habe vorgestellt, wie Sie mit Python und OpenCV Ihre eigene virtuelle Webkamera erstellen. Ich habe die Effekte hier nicht erwähnt, aber Sie können Ihre Lieblingseffekte mit jeder Funktion von OpenCV anwenden. Abschließend möchte ich als Beispieleffekt den Prozess des Entfernens des Hintergrunds des grünen Hintergrunds, den oben erwähnten Fehler von pyvirtualcam und die Lösung vorstellen.

Blinddarm

Effektbeispiel: Ohne grünen Hintergrund

Fügen Sie den bisherigen Beispielcode unterhalb des Teils hinzu, in dem "# hier einen Effekt anwenden".

frame = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
#Die zweite und dritte Variable sind die Minimal- und Maximalwerte des HSV-Farbraums, die in jeder Umgebung entsprechend geändert werden können.
mask = cv.inRange(frame, (48, 158, 32), (88, 255, 255))
mask_inv = cv.bitwise_not(mask)
bg = np.zeros(frame.shape, dtype=np.uint8)
#Stellen Sie die gewünschte Farbe als Hintergrund ein
bg[:] = [255, 255, 255]
front_result = cv.bitwise_and(frame, frame, mask=mask_in)
back_result = cv.bitwise_and(bg, bg, mask=mask)
frame = cv.add(front_result, back_result)

Fix pyvirtualcam

Dies wurde ebenfalls in Issue erstellt, aber es scheint, dass der Beendigungsprozess nicht beschrieben wird. Sie können erstellen und installieren, indem Sie das Repository selbst klonen, die Korrekturen korrigieren und setup.py ausführen. Der geänderte Teil ist "pyvirtualcam / pyvirtualcam / native_windows / main.cpp", und die folgende Funktion wird hinzugefügt.

void stop(){
    virtual_output_stop();
}

Ich denke, dass die Funktion korrekt aufgerufen wird und der Beendigungsprozess korrekt aufgerufen wird .... Aus irgendeinem Grund ist die OBS-Kamera jedoch manchmal blockiert, und es gibt immer noch einen Fehler, der nicht ohne Neustart behoben werden kann, und wir untersuchen die Ursache.

Recommended Posts