Crie uma nova fonte de câmera usando OpenCV Python (driver de câmera usando Python)
Alguém conhece uma maneira de criar uma fonte de câmera usando python? Por exemplo, tenho 2 câmeras:
- Webcam
- Câmera USB
Sempre que uso qualquer aplicativo da web ou interface que requer câmera, tenho a opção de selecionar uma fonte de câmera entre as duas mencionadas acima.
O que eu quero alcançar é que estou processando frames em tempo real em meu programa python com um portal de câmera próprio 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)
Agora, quero usar isso framecomo uma fonte de câmera, então, da próxima vez, sempre que abrir um software ou aplicativo da web que requer uma câmera, ele mostrará a opção a seguir:
- Webcam
- Câmera USB
- Python Cam (ou qualquer que seja o nome)
Alguém tem algum conselho ou dica sobre como fazer isso? Eu vi alguns softwares premium que geram sua própria fonte de câmera, mas são escritos em c ++. Eu queria saber se isso poderia acontecer em python ou não.
Aqui está um exemplo do mesmo:
Como você pode ver, existem várias fontes de câmera lá. Quero adicionar uma fonte de câmera que exibe os quadros processados por python em seu feed.
Respostas
Você pode usar v4l2loopback (https://github.com/umlaeute/v4l2loopback) por isso. Ele é escrito em C, mas existem alguns wrappers python. Eu usei virtualvideo (https://github.com/Flashs/virtualvideo)
O README do virtualvideo é bastante simples, mas aqui está a minha modificação do exemplo do github para corresponder ao seu 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()
em init_output, o primeiro argumento é o recurso de câmera virtual que criei ao adicionar o módulo do kernel:
sudo modprobe v4l2loopback video_nr=2 exclusive_caps=1
os últimos argumentos são o tamanho da minha webcam e o formato dos pixels.
Você deve ver esta opção nos hangouts:
Primeiro você precisa obter uma lista das câmeras disponíveis, o código para isso pode ser encontrado aqui
Então, uma vez que uma câmera é escolhida, use camera = cv2.VideoCapture(chosen_port)