Crie uma nova fonte de câmera usando OpenCV Python (driver de câmera usando Python)

Sep 11 2020

Alguém conhece uma maneira de criar uma fonte de câmera usando python? Por exemplo, tenho 2 câmeras:

  1. Webcam
  2. 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:

  1. Webcam
  2. Câmera USB
  3. 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

2 GuilhermeSant'Ana Sep 21 2020 at 21:03

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:

DrBwts Sep 11 2020 at 14:32

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)