Erstellen Sie eine neue Kameraquelle mit OpenCV Python (Kameratreiber mit Python)

Sep 11 2020

Kennt jemand eine Möglichkeit, eine Kameraquelle mit Python zu erstellen? So habe ich zum Beispiel 2 Kameras:

  1. Webcam
  2. USB-Kamera

Immer wenn ich eine Webanwendung oder Schnittstelle verwende, für die eine Kamera erforderlich ist, kann ich eine der beiden oben genannten Kameraquellen auswählen.

Was ich erreichen möchte, ist, dass ich Echtzeit-Frames in meinem Python-Programm mit einem eigenen Kamera-Portal wie folgt verarbeite:

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)

Jetzt möchte ich dies frameals Kameraquelle verwenden. Wenn ich das nächste Mal eine Software oder Web-App öffne, für die eine Kamera erforderlich ist, wird die folgende Option angezeigt:

  1. Webcam
  2. USB-Kamera
  3. Python Cam (oder wie auch immer der Name sein mag)

Hat jemand einen Rat oder einen Hinweis, wie man das macht? Ich habe einige Premium-Software gesehen, die ihre eigene Kameraquelle generiert, aber sie sind in C ++ geschrieben. Ich habe mich gefragt, ob dies in Python passieren könnte oder nicht.

Hier ist ein Beispiel dafür:

Wie Sie sehen können, gibt es dort mehrere Kameraquellen. Ich möchte eine Kameraquelle hinzufügen, die die von Python verarbeiteten Bilder in ihrem Feed anzeigt.

Antworten

2 GuilhermeSant'Ana Sep 21 2020 at 21:03

Sie können v4l2loopback verwenden (https://github.com/umlaeute/v4l2loopback) dafür. Es ist in C geschrieben, aber es gibt einige Python-Wrapper. Ich habe virtualvideo verwendet (https://github.com/Flashs/virtualvideo).
Das Virtualvideo README ist ziemlich einfach, aber hier ist meine Modifikation des Github-Beispiels, um Ihrem Ziel zu entsprechen:

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()

In init_output ist das erste Argument die virtuelle Kameraressource, die ich beim Hinzufügen des Kernelmoduls erstellt habe:

sudo modprobe v4l2loopback video_nr=2 exclusive_caps=1

Die letzten Argumente sind meine Webcam-Größe und das Pixelformat.

Diese Option sollte in Hangouts angezeigt werden:

DrBwts Sep 11 2020 at 14:32

Zuerst müssen Sie eine Liste der verfügbaren Kameras erhalten, den Code dafür finden Sie hier

Sobald eine Kamera ausgewählt ist, verwenden Sie camera = cv2.VideoCapture(chosen_port)