使用 OpenCV Python 创建一个新的相机源(使用 Python 的相机驱动程序)

Shi*_*il 5 python opencv-python

有谁知道使用 python 创建相机源的方法?例如,我有 2 个摄像头:

  1. 摄像头
  2. USB 摄像头

每当我使用任何需要摄像头的 Web 应用程序或界面时,我都可以从上述两个选项中选择一个摄像头源。

我想要实现的是,我正在使用我自己的相机门户在我的 python 程序中处理实时帧,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

现在我想将其frame用作相机源,因此下次每当我打开需要相机的软件或网络应用程序时,它都会显示如下选项:

  1. 摄像头
  2. USB 摄像头
  3. Python Cam(或任何名称)

有没有人对如何去做有任何建议或提示?我见过一些高级软件,它们生成自己的相机源,但它们是用 C++ 编写的。我想知道这是否会发生在 python 中。

这是一个相同的例子:

在此处输入图片说明

如您所见,那里有多个摄像机源。我想添加一个相机源,它在其提要中显示由 python 处理的帧。

Gui*_*Ana 5

您可以使用v4l2loopback ( https://github.com/umlaeute/v4l2loopback ) 来实现。它是用 C 编写的,但有一些 python 包装器。我使用过虚拟视频https://github.com/Flashs/virtualvideo)。
virtualvideo README 非常简单,但这里是我对其 github 示例的修改,以符合您的目标:

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()
Run Code Online (Sandbox Code Playgroud)

init_output中,第一个参数是我在添加内核模块时创建的虚拟相机资源:

sudo modprobe v4l2loopback video_nr=2 exclusive_caps=1
Run Code Online (Sandbox Code Playgroud)

最后一个参数是我的网络摄像头大小和像素格式。

您应该在环聊中看到此选项:

环聊选项