Передать массив numpy к виртуальному видеоустройству

Я хочу направить изображения на виртуальное видеоустройство (например, / dev / video0), изображения создаются внутри цикла с желаемой частотой кадров.

В этом минимальном примере я только два массива, которые чередуются в окне cv2. Теперь я ищу хорошее решение для передачи массивов виртуальному устройству.

Я видел, что ffmpeg-python может работать асинхронно с ffmpeg.run_async(), но пока я не мог заставить что-либо работать с этим пакетом.

пример кода без материала ffmpeg:

      #!/usr/bin/env python3

import cv2
import numpy as np
import time

window_name = 'virtual-camera'
cv2.namedWindow(window_name, cv2.WINDOW_GUI_EXPANDED)

img1 = np.random.uniform(0, 255, (1080, 1440, 3)).astype('uint8')
img2 = np.random.uniform(0, 255, (1080, 1440, 3)).astype('uint8')

for i in range(125):
    time.sleep(0.04)
    if i % 2:
        img = img1
    else:
        img = img2
    cv2.imshow(window_name, img)
    cv2.waitKey(1)
cv2.destroyAllWindows()

2 ответа

Прежде всего, вам нужно будет настроить виртуальную камеру , например, с v4l2loopback. См. Здесь, как его установить (не обращайте внимания на примеры использования).
Затем вы можете просто записать в виртуальную камеру, как в обычный файл (то есть позволить openCV записывать изображения, чтобы сказать; как это сделать, вы должны выяснить сами, потому что я не эксперт в openCV).
В конце концов, вы можете использовать ffmpeg-python с /dev/video0 в качестве входного файла сделайте что-нибудь с видео, и все!

Как написал в своем ответе Программист , можно создать фиктивное устройство с помощью пакета v4l2loopback . Публиковать изображения, видео или рабочий стол на фиктивном устройстве уже было легко с помощью ffmpeg, но я хочу передать его прямо из скрипта python, где я захватываю изображения, на фиктивное устройство. Я все еще думаю, что это возможно с ffmpeg-python, но я нашел отличный ответ от Alp, который проливает свет на темноту. Пакет pyfakewebcam - идеальное решение проблемы.

Для полноты картины вот мой расширенный минимальный рабочий пример:

      #!/usr/bin/env python3

import time

import cv2
import numpy as np
import pyfakewebcam

WIDTH = 1440
HEIGHT = 1080
DEVICE = '/dev/video0'

fake_cam = pyfakewebcam.FakeWebcam(DEVICE, WIDTH, HEIGHT)

window_name = 'virtual-camera'
cv2.namedWindow(window_name, cv2.WINDOW_GUI_EXPANDED)

img1 = np.random.uniform(0, 255, (HEIGHT, WIDTH, 3)).astype('uint8')
img2 = np.random.uniform(0, 255, (HEIGHT, WIDTH, 3)).astype('uint8')

for i in range(125):
    time.sleep(0.04)
    if i % 2:
        img = img1
    else:
        img = img2
    fake_cam.schedule_frame(img)
    cv2.imshow(window_name, img)
    cv2.waitKey(1)
cv2.destroyAllWindows()
Другие вопросы по тегам