Créez votre propre caméra virtuelle avec Python + OpenCV et appliquez des effets originaux

Une caméra virtuelle est un logiciel qui peut être reconnu par un PC en tant que périphérique d'entrée d'image tel qu'une caméra Web. En utilisant cela, vous pouvez diffuser votre vidéo préférée (pas l'entrée de la caméra frontale) vers des systèmes de visioconférence </ b> tels que Zoom, WebEx et Meet, qui sont souvent utilisés de nos jours.

Une caméra virtuelle couramment utilisée est OBS Studio, que j'utilise souvent (il semble que la caméra virtuelle soit récemment devenue disponible en standard sans plug-in). n'est-ce pas). Cependant, je ne veux pas l'utiliser au quotidien car il est extrêmement lourd car il a beaucoup de fonctions. (Le taux d'utilisation du GPU est d'environ 80% avec RTX2028 SUPER, mais est-ce juste moi ...?)

Par conséquent, j'ai pensé que je pouvais créer moi-même une caméra virtuelle et appliquer des effets, alors j'ai essayé divers essais et erreurs. Il y a toujours un bogue de cause inconnue, mais je voudrais le présenter car il a commencé à fonctionner.

supposition

Ce système est conçu pour Windows. </ b> En raison de la gestion des couches graphiques basses, la méthode diffère considérablement dans d'autres systèmes d'exploitation tels que «Mac» et «Linux». Au cours de mes recherches, j'ai vu un outil qui pourrait être utilisé sur un autre OS, donc je voudrais le présenter, mais ne lui faites pas confiance car il n'a pas été vérifié.

Cette configuration

Tout d'abord, je voudrais conclure qu'il était difficile de faire une caméra virtuelle complète par moi-même, alors je l'ai réalisé en envoyant l'entrée de mon propre logiciel à la caméra virtuelle installée dans OBS </ b> mentionné précédemment. Fait. Le diagramme de configuration est le suivant. 構成図.png Pour créer une caméra virtuelle à part entière, vous devrez étudier les API de bas niveau liées aux graphiques, telles que Direct Show API. Je l'ai trouvé intéressant, je vais donc l'essayer la prochaine fois.

la mise en oeuvre

Obtenez des entrées et affichez chaque image

Tout d'abord, de manière générale, nous utiliserons OpenCV pour acquérir l'image de chaque image à partir de la source de données et implémenter la partie à afficher. Puisqu'il s'agit d'une partie très générale, chaque processus n'est écrit que dans le code.

import cv2

#Sélectionnez la source de données (caméra Web) à acquérir
cap = cv2.VideoCapture(0)

while True:
    #Obtenez l'image de chaque cadre
    ret, frame = cap.read()

    #Appliquez un effet ici

    #Afficher l'image
    #Je souhaite afficher sur une caméra Web virtuelle
    cv2.imshow("Window Name", frame)

    #Affichez 30 images et terminez l'affichage en appuyant sur la touche Entrée.
    if cv2.waitkey(30) == 13:
        break

#Terminer le traitement
cv2.destroyAllWindows()
cap.release()

Vous avez maintenant implémenté la partie qui affiche l'image de la caméra Web dans la fenêtre. Ensuite, envisagez de saisir cet affichage dans la caméra virtuelle OBS.

Envoyer des informations à la caméra virtuelle

Pour les fenêtres

J'utiliserai un package appelé pyvirtualcam. Comme vous pouvez le voir dans le référentiel GitHub, si vous avez un environnement avec pip, vous pouvez l'installer avec pip install pyvirtualcam (bien que le référentiel actuel présente des défauts </ b> et que la source soit reconstruite. Sinon, des bogues peuvent survenir. Les contre-mesures sont répertoriées à la fin de cet article.).

Ceci est également écrit sur la page du référentiel ci-dessus, mais si vous avez déjà OBS (caméra virtuelle), vous n'avez pas besoin de le faire, mais vous devez activer la caméra Web virtuelle OBS. Il existe deux méthodes,

  1. Installez OBS (il sera installé sans autorisation)
  2. Téléchargez uniquement la partie Caméra virtuelle depuis https://github.com/CatxFish/obs-virtual-cam/releases et dans le référentiel egsvr32 / n / i: 1" obs-virtualcam \ bin \ 64bit \ obs-virtualsource Tapez .dll " pour activer

Méthode 1 mais je ne l'ai pas confirmée. Dans OBS récent, la caméra virtuelle est incluse en standard, donc je pense que tout va bien, mais si vous obtenez une erreur, veuillez essayer la méthode 2.

Après avoir importé le package, remplacez le code ci-dessus comme suit.

import cv2
import pyvirtualcam

#Sélectionnez la source de données (caméra Web) à acquérir
cap = cv2.VideoCapture(0)

#Obtenir la taille de l'image à partir de la première image
ret, frame = cap.read()
with pyvirtualcam.Camera(width=frame.shape[1], height=frame.shape[0], fps=30, delay=0) as cam:
    while True:
        #Obtenez l'image de chaque cadre
        ret, frame = cap.read()

        #Appliquez un effet ici

        #Changer l'espace colorimétrique
        #Activer le canal α et l'ordre en RVB
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)

        #Diffuser des images sur une caméra virtuelle
        cam.send(frame)

        #Puisque l'image n'est plus affichée à l'écran, utilisez la fonction de pyvirtualcam pour attendre jusqu'à l'image suivante.
        cam.sleep_until_next_frame()

#Terminer le traitement
cap.release()

Vous pouvez maintenant diffuser l'image sur la caméra virtuelle OBS. Puisqu'il n'y a aucun moyen de terminer par une entrée de touche, veuillez terminer par Ctrl + C etc.

Après cela, si vous spécifiez la caméra Web à utiliser du côté du système de conférence Web comme «Caméra OBS», l'image de la caméra Web acquise par ce programme doit être affichée. Dans cet état, l'image de la caméra Web dégouline, nous allons donc appliquer l'effet à partir d'ici.

Pour Mac et Linux (non confirmé)

Pour Mac

Il y avait OBS Virtual Camera Mac Plugin, donc si vous l'utilisez, vous pourrez peut-être faire la même chose que la méthode Windows ... Hmm (il a été écrit dans le référentiel écrit dans la méthode Windows)

Pour Linux

Linux a une bibliothèque appelée v4l2loopback qui facilite la création de caméras virtuelles. Il existe de nombreux wrappers python tels que pyfakewebcam qui l'utilisent, donc je pense que leur utilisation le rendra beaucoup plus facile à implémenter que Windows. Je ne l'ai pas confirmé, mais si vous souhaitez utiliser pyfakewebcam, vous devez modifier le code ci-dessus comme suit.

import cv2
import pyfakewebcam

#Sélectionnez la source de données (caméra Web) à acquérir
cap = cv2.VideoCapture(0)

#Obtenir la taille de l'image à partir de la première image
ret, frame = cap.read()
camera = pyfakewebcam.FakeWebcam('/dev/video1', frame.shape[1], frame.shape[0])
while True:
    #Obtenez l'image de chaque cadre
    ret, frame = cap.read()

    #Appliquez un effet ici

    #Changer l'espace colorimétrique
    #Dans l'ordre RVB
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    #Diffuser des images sur une caméra virtuelle
    camera.schedule_frame(frame)

    #L'image n'est plus affichée à l'écran, alors attendez jusqu'à l'image suivante (30 ips)
    time.sleep(0.033)

#Terminer le traitement
cap.release()

en conclusion

J'ai présenté comment créer votre propre caméra Web virtuelle en utilisant Python et OpenCV. Je n'ai pas mentionné les effets ici, mais vous pouvez appliquer vos effets préférés en utilisant chaque fonction d'OpenCV. Enfin, à titre d'exemple d'effet, je voudrais vous présenter le processus de suppression de l'arrière-plan du fond vert, le bug de pyvirtualcam mentionné ci-dessus et la solution.

annexe

Exemple d'effet: sans fond de fond vert

Dans l'exemple de code jusqu'à présent, ajoutez-le sous la partie où # Apply some effect here.

frame = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
#Les deuxième et troisième variables sont les valeurs minimum et maximum de l'espace colorimétrique HSV, qui peuvent être modifiées selon les besoins dans chaque environnement.
mask = cv.inRange(frame, (48, 158, 32), (88, 255, 255))
mask_inv = cv.bitwise_not(mask)
bg = np.zeros(frame.shape, dtype=np.uint8)
#Définissez la couleur souhaitée comme arrière-plan
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)

Réparer pyvirtualcam

Cela a également été intégré dans Issue, mais il semble que le processus de résiliation n'est pas décrit. Vous pouvez construire et installer en clonant vous-même le référentiel, en corrigeant les corrections et en exécutant setup.py. La partie modifiée est pyvirtualcam / pyvirtualcam / native_windows / main.cpp, et la fonction suivante est ajoutée.

void stop(){
    virtual_output_stop();
}

Je pense que la fonction est appelée correctement et que le processus de terminaison est appelé correctement ... Mais pour une raison quelconque, OBS-Camera est parfois bloqué, et il y a toujours un bogue qui ne peut pas être corrigé sans redémarrer, et nous en recherchons la cause.

Recommended Posts