OpenCV Python (Python Kullanan Kamera Sürücüsü) kullanarak yeni bir kamera kaynağı oluşturun
Python kullanarak kamera kaynağı oluşturmanın bir yolunu bilen var mı? Örneğin 2 kameram var:
- Web kamerası
- 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:
- Web kamerası
- USB Kamera
- 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
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:
Ö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)