Передать массив 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()