[PYTHON] Créez un effecteur pour la visioconférence avec Spout + OpenCV + dlib (Partie 1)

Le bec peut être sélectionné comme caméra à partir d'un système de visioconférence tel que Zoom, donc si vous sélectionnez Caméra Web → Bec (Gonyogonyo en Python) → Zoom etc., vous ne voulez pas montrer votre visage tel qu'il est lorsque vous travaillez à domicile, mais vous voulez montrer votre expression, etc. , Vous pouvez facilement appliquer un effet sur le visage, ou au contraire effacer l'arrière-plan autre que le visage. J'ai écrit "facilement", mais en fait l'article original est ancien, donc ça ne marche pas si les versions de chaque module sont incompatibles, donc Shioume est mon savoir-faire.

Tout d'abord, cliquez ici pour la famille de têtes Spout, https://spout.zeal.co/ Installez Spout à partir d'ici.

Ensuite, téléchargez Spout pour Python à partir de:

https://github.com/spiraltechnica/Spout-for-Python

Si chaque code de l'exemple de ce Spout-for-Python-master fonctionne, vous pouvez utiliser SpoutSDK.pyd dans Libs tel quel, mais si cela ne fonctionne pas, vous devez le construire vous-même.

Lors de la construction pour Python, les sites suivants seront utiles. Selon l'original ci-dessus, Cela prend beaucoup de temps car il construit toutes les bibliothèques autres que Python.

https://rusin.work/vjing/tools/spout-for-python/

L'une des combinaisons de versions de travail dans ce cas est la suivante. Ce sont toutes les plateformes On ne sait pas si cela fonctionne avec. Cela peut fonctionner ou non sur votre PC. En particulier, opencv etc. peut ne pas fonctionner correctement. Si vous copiez la version de travail du dossier Python sur le PC qui ne fonctionne pas, cela fonctionnera.

Python 3.74 PyOpenGL 3.15 pygame 1.18.2 opencv_python 4.2.0.34

Maintenant, construisez-le pour créer SpoutSDK.dll, que vous avez renommé SpoutSDK.pyd. Disponible depuis Python avec l'importation SpoutSDK.

Si le code suivant fonctionne sur un PC équipé de WebCam, ce n'est pas grave pour le moment. En d'autres termes, vous pouvez recevoir la vidéo de WebCam avec SpoutReceive dans le dossier DEMO de Spout. Vérifiez s'il vous plaît. Si vous pouvez le recevoir, utilisez Spout comme une caméra de Zoom, etc. Si cette option est sélectionnée, vous pouvez envoyer la vidéo à une visioconférence.

Je vais vous montrer comment faire un effet là-dessus dans le prochain post.

import sys
sys.path.append('../Library')
import cv2
import numpy as np
import SpoutSDK
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

def main():

    # window details
    width = 640 
    height = 480 
    display = (width,height)
    
    # window setup
    pygame.init() 
    pygame.display.set_caption('Spout Python Sender')
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
    pygame.display.gl_set_attribute(pygame.GL_ALPHA_SIZE, 8)

    cap = cv2.VideoCapture(0)
    if cap.isOpened() is False:
        raise("IO Error")
    cap.set(cv2.CAP_PROP_FPS, 30)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

    cap.set(3, width)
    cap.set(4, height)

      # OpenGL init
    glMatrixMode(GL_PROJECTION)
    glOrtho(0,width,height,0,1,-1)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glDisable(GL_DEPTH_TEST)
    glClearColor(0.0,0.0,0.0,0.0)
    glEnable(GL_TEXTURE_2D)
   
    # init spout sender
    spoutSender = SpoutSDK.SpoutSender()
    spoutSenderWidth = width
    spoutSenderHeight = height
    # Its signature in c++ looks like this: bool CreateSender(const char *Sendername, unsigned int width, unsigned int height, DWORD dwFormat = 0);
    spoutSender.CreateSender('Spout for Python Webcam Sender Example', width, height, 0)
    
    # create texture id for use with Spout
    senderTextureID = glGenTextures(1)

    # initalise our sender texture
    glBindTexture(GL_TEXTURE_2D, senderTextureID)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glBindTexture(GL_TEXTURE_2D, 0)

    # loop
    while True:

        for event in pygame.event.get():
           if event.type == pygame.QUIT:
               pygame.quit()
               quit()
        
        ret, frame = cap.read() #read camera image
        #img = cv2.imread('image.png') # if use the image file
        frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) #BGR-->RGB
        h, w = frame.shape[:2]
        glBindTexture(GL_TEXTURE_2D, senderTextureID)
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, frame)

        spoutSender.SendTexture(senderTextureID, GL_TEXTURE_2D, spoutSenderWidth, spoutSenderHeight, False, 0)
        #glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        # Clear screen
        glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT )
        # reset the drawing perspective
        glLoadIdentity()

        # Draw texture to screen
        glBegin(GL_QUADS)
        ##
        glTexCoord(0,0)        
        glVertex2f(0,0)
        #
        glTexCoord(1,0)
        glVertex2f(width,0)
        #
        glTexCoord(1,1)
        glVertex2f(width,height)
        #
        glTexCoord(0,1)
        glVertex2f(0,height)
        ##
        glEnd()
        
        pygame.display.flip()
        # unbind our sender texture
        glBindTexture(GL_TEXTURE_2D, 0)
      #  pygame.time.wait(10)

if __name__ == '__main__':
    main()


Recommended Posts

Créez un effecteur pour la visioconférence avec Spout + OpenCV + dlib (Partie 1)
Créez facilement des miniatures à partir de dossiers vidéo érotiques avec opencv
Chargement de la vidéo en boucle avec opencv
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 1
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 3
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 4
Faisons une chemise IoT avec Lambda, Kinesis, Raspberry Pi [Partie 1]
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
Recherche de mots composés à phase identique avec opencv
Dessinez une illustration avec Python + OpenCV
Créer un exe Scrapy avec Pyinstaller
Créer une boîte de publication MQTT Partie 2