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