Créer une nouvelle source de caméra à l'aide d'OpenCV Python (Driver de caméra à l'aide de Python)
Est-ce que quelqu'un connaît un moyen de créer une source de caméra en utilisant python? Donc, par exemple, j'ai 2 caméras:
- Webcam
- Caméra USB
Chaque fois que j'utilise une application Web ou une interface nécessitant une caméra, j'ai la possibilité de sélectionner une source de caméra parmi les deux mentionnées ci-dessus.
Ce que je veux réaliser, c'est que je traite des images en temps réel dans mon programme python avec mon propre portail de caméra comme celui-ci:
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)
Maintenant, je veux l'utiliser framecomme source de caméra, donc la prochaine fois que j'ouvrirai un logiciel ou une application Web nécessitant une caméra, l'option affichera comme suit:
- Webcam
- Caméra USB
- Python Cam (ou quel que soit le nom)
Quelqu'un a-t-il des conseils ou des indices sur la façon de procéder? J'ai vu des logiciels premium qui génèrent leur propre source de caméra mais ils sont écrits en C ++. Je me demandais si cela pouvait arriver en python ou non.
Voici un exemple de la même chose:
Comme vous pouvez le voir, il existe plusieurs sources de caméras. Je souhaite ajouter une source de caméra qui affiche les images traitées par python dans son flux.
Réponses
Vous pouvez utiliser v4l2loopback (https://github.com/umlaeute/v4l2loopback) pour ça. Il est écrit en C mais il existe des wrappers python. J'ai utilisé virtualvideo (https://github.com/Flashs/virtualvideo).
Le fichier README de virtualvideo est assez simple, mais voici ma modification de leur exemple github pour correspondre à votre objectif:
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()
dans init_output, le premier argument est la ressource de caméra virtuelle que j'ai créée lors de l'ajout du module noyau:
sudo modprobe v4l2loopback video_nr=2 exclusive_caps=1
les derniers arguments sont la taille de ma webcam et le format des pixels.
Vous devriez voir cette option dans les hangouts:
Vous devez d'abord obtenir une liste des caméras disponibles, le code pour cela peut être trouvé ici
Ensuite, une fois la caméra choisie, utilisez camera = cv2.VideoCapture(chosen_port)