Cree una nueva fuente de cámara usando OpenCV Python (controlador de cámara usando Python)
¿Alguien sabe una forma de crear una fuente de cámara usando Python? Entonces, por ejemplo, tengo 2 cámaras:
- Cámara web
- Cámara USB
Siempre que utilizo cualquier aplicación web o interfaz que requiera cámara, tengo la opción de seleccionar una fuente de cámara de las dos mencionadas anteriormente.
Lo que quiero lograr es que estoy procesando marcos de tiempo real en mi programa de Python con un portal de cámara propio como este:
import numpy as np
import cv2
while True:
_,frame = self.cam.read()
k = cv2.waitKey(1)
if k & 0xFF == ord('q'):
self.cam.release()
cv2.destroyAllWindows()
break
else:
cv2.imshow("Frame",frame)
Ahora quiero usar esto framecomo fuente de cámara, así que la próxima vez que abra un software o aplicación web que requiera cámara, mostrará la siguiente opción:
- Cámara web
- Cámara USB
- Python Cam (o como se llame)
¿Alguien tiene algún consejo o pista sobre cómo hacerlo? He visto algunos softwares premium que generan su propia fuente de cámara pero están escritos en C ++. Me preguntaba si esto podría suceder en Python o no.
Aquí hay un ejemplo de lo mismo:
Como puede ver, hay varias fuentes de cámara allí. Quiero agregar una fuente de cámara que muestra los fotogramas procesados por Python en su feed.
Respuestas
Puede usar v4l2loopback (https://github.com/umlaeute/v4l2loopback) para eso. Está escrito en C pero hay algunas envolturas de Python. He usado virtualvideo (https://github.com/Flashs/virtualvideo).
El README de video virtual es bastante sencillo, pero aquí está mi modificación de su ejemplo de github para que coincida con su objetivo:
import virtualvideo
import cv2
class MyVideoSource(virtualvideo.VideoSource):
def __init__(self):
self.cam = cv2.VideoCapture(0)
_, img = self.cam.read()
size = img.shape
#opencv's shape is y,x,channels
self._size = (size[1],size[0])
def img_size(self):
return self._size
def fps(self):
return 30
def generator(self):
while True:
_, img = self.cam.read()
yield img
vidsrc = MyVideoSource()
fvd = virtualvideo.FakeVideoDevice()
fvd.init_input(vidsrc)
fvd.init_output(2, 640, 480, pix_fmt='yuyv422')
fvd.run()
en init_output, el primer argumento es el recurso de cámara virtual que he creado al agregar el módulo del kernel:
sudo modprobe v4l2loopback video_nr=2 exclusive_caps=1
los últimos argumentos son el tamaño de mi cámara web y el formato de píxeles.
Debería ver esta opción en los hangouts:
Primero necesita obtener una lista de las cámaras disponibles, el código para eso se puede encontrar aquí
Luego, una vez que se elige una cámara, use camera = cv2.VideoCapture(chosen_port)