Jan-12-2022, 12:49 AM
I'm trying to let Spout receive a webcam capture done with OpenCV but I keep getting errors. How can I approach this problem in the best way?
Error:C:\Users\User\Desktop\Spout-for-Python-master2\venv\Scripts\python.exe C:/Users/User/Desktop/Spout-for-Python-master2/spout_webcam_sender_example.py
pygame 2.1.2 (SDL 2.0.18, Python 3.6.0)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "C:/Users/User/Desktop/Spout-for-Python-master2/spout_webcam_sender_example.py", line 125, in <module>
main()
File "C:/Users/User/Desktop/Spout-for-Python-master2/spout_webcam_sender_example.py", line 94, in main
spoutSender.SendTexture(senderTextureID, GL_TEXTURE_2D, spoutSenderWidth, spoutSenderHeight, False, 0)
Boost.Python.ArgumentError: Python argument types in
SpoutSender.SendTexture(SpoutSender, numpy.uintc, IntConstant, int, int, bool, int)
did not match C++ signature:
SendTexture(class SpoutSender {lvalue}, unsigned int, unsigned int, unsigned int, unsigned int, bool, unsigned int)
[ WARN:[email protected]] global D:\a\opencv-python\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (539) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callbackCode:import sys
import os
sys.path.append('{}/Library/3{}'.format(os.getcwd(), sys.version_info[1]))
import argparse
import cv2
import SpoutSDK
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
"""parsing and configuration"""
def parse_args():
desc = "Spout for Python webcam sender example"
parser = argparse.ArgumentParser(description=desc)
parser.add_argument('--camSize', nargs = 2, type=int, default=[640, 480], help='File path of content image (notation in the paper : x)')
parser.add_argument('--camID', type=int, default=1, help='Webcam Device ID)')
return parser.parse_args()
"""main"""
def main():
# parse arguments
args = parse_args()
# window details
width = args.camSize[0]
height = args.camSize[1]
display = (width,height)
# window setup
pygame.init()
pygame.display.set_caption('Webcam')
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
pygame.display.gl_set_attribute(pygame.GL_ALPHA_SIZE, 8)
# init capture & set size
#cap = cv2.VideoCapture(args.camID)
cap = cv2.VideoCapture(0)
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()
frame = cv2.flip(frame, 1 )
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Copy the frame from the webcam into the sender texture
glBindTexture(GL_TEXTURE_2D, senderTextureID)
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, frame )
# Send texture to Spout
# Its signature in C++ looks like this: bool SendTexture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert=true, GLuint HostFBO = 0);
spoutSender.SendTexture(senderTextureID, GL_TEXTURE_2D, spoutSenderWidth, spoutSenderHeight, False, 0)
# 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()
# update window
pygame.display.flip()
# unbind our sender texture
glBindTexture(GL_TEXTURE_2D, 0)
if __name__ == "__main__":
main()
