OpenCV Python (Python Kullanan Kamera Sürücüsü) kullanarak yeni bir kamera kaynağı oluşturun

Sep 11 2020

Python kullanarak kamera kaynağı oluşturmanın bir yolunu bilen var mı? Örneğin 2 kameram var:

  1. Web kamerası
  2. USB Kamera

Kamera gerektiren herhangi bir web uygulamasını veya arayüzü kullandığımda, yukarıda belirtilen ikisinden bir kamera kaynağı seçme seçeneğim var.

Yapmak istediğim şey, gerçek zamanlı kareleri python programımda kendi kamera portalımla şu şekilde işliyor olmam:

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)

Şimdi bunu framebir kamera kaynağı olarak kullanmak istiyorum, bu yüzden bir dahaki sefere kamera gerektiren bir yazılımı veya web uygulamasını her açtığımda, aşağıdaki gibi seçeneği gösteriyor:

  1. Web kamerası
  2. USB Kamera
  3. Python Cam (Veya adı ne olursa olsun)

Bunun nasıl yapılacağına dair herhangi bir tavsiyesi veya ipucu olan var mı? Kendi kamera kaynaklarını üreten bazı premium yazılımlar gördüm, ancak c ++ ile yazılmışlar. Bunun python'da olup olmayacağını merak ediyordum.

İşte bunun bir örneği:

Gördüğünüz gibi orada birden fazla kamera kaynağı var. Python tarafından işlenen kareleri beslemesinde görüntüleyen bir kamera kaynağı eklemek istiyorum.

Yanıtlar

2 GuilhermeSant'Ana Sep 21 2020 at 21:03

V4l2loopback'i kullanabilirsiniz (https://github.com/umlaeute/v4l2loopback) bunun için. C ile yazılmıştır, ancak bazı python sarmalayıcıları vardır. Virtualvideo kullandım (https://github.com/Flashs/virtualvideo).
Virtualvideo README oldukça basittir, ancak işte amacınıza uyacak şekilde github örneğindeki modifikasyonum:

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

içinde init_output İlk argüman çekirdek modülü eklerken ı oluşturduk thar sanal kamera kaynaktır:

sudo modprobe v4l2loopback video_nr=2 exclusive_caps=1

son argümanlar web kameramın boyutu ve piksel formatıdır.

Hangout'larda bu seçeneği görmelisiniz:

DrBwts Sep 11 2020 at 14:32

Öncelikle mevcut kameraların bir listesini almanız gerekir, bunun kodu burada bulunabilir

Sonra bir kamera seçildikten sonra kullanın camera = cv2.VideoCapture(chosen_port)