Как синхронизировать несколько камер USB 3 с помощью GStreamer? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь создать приложение, которое будет захватывать изображения с трех камер USB 3 со скоростью около 10 кадров в секунду.Я также хочу иметь возможность сохранять эти изображения в файлы.

Я поиграл с gst-launch и попытался записать в файлы, используя multifilesink.

gst-launch-1.0 -v v4l2src device=/dev/video1 ! video/x-raw,framerate=30/1,width=1280,height=720 ! videoconvert ! jpegenc ! multifilesink location=image1_%06d.jpg v4l2src device=/dev/video2 ! video/x-raw,framerate=30/1,width=1280,height=720 ! videoconvert ! jpegenc ! multifilesink location=image2_%06d.jpg" v4l2src device=/dev/video3 ! video/x-raw,framerate=30/1,width=1280,height=720 ! videoconvert ! jpegenc ! multifilesink location=image3_%06d.jpg

Затем я попытался сделать снимкиитеративно с камер (я также пытался использовать отдельные потоки для каждой камеры).

def open_cam_usb(dev, width, height):
    # We want to set width and height here, otherwise we could just do:
    #     return cv2.VideoCapture(dev)
    gst_str = ('v4l2src device=/dev/video{} ! '
               'video/x-raw, width=(int){}, height=(int){}, '
               'format=(string)RGB ! '
               'videoconvert ! appsink max-buffers=1').format(dev, width, height)
    print("create video capture")
    return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)

def take_picture(cap, device_number):
    frameId = int(round(cap.get(1)))
    success, image = cap.read()
    cv2.imwrite("FolderSeconds/image%d_frame%d.jpg" % (device_number,frameId) , image)
    print(device_number, frameId)

def main():
    args = parse_args()
    print('Called with args:')
    print(args)
    print('OpenCV version: {}'.format(cv2.__version__))
    cameras = []

    for i in range(3):
            cap = open_cam_usb(i+1, args.image_width, args.image_height)
            cameras.append(cap)
    time.sleep(3)

    while True:
        for i in range(3):
            take_picture(cameras[i], i+1)
if __name__ == '__main__':
    main()

Однако всякий раз, когда я запускал такой скрипт и смотрел на запущенные потоки, казалось, что потоков больше, чем я создал,(т. е. четыре запущенных потока, если я не создал более одного).

Через некоторое время (в диапазоне от мгновенно до 4 минут после запуска сценария) некоторые потоки кажутся зависшими / умирающимии камеры перестают фотографировать.

Кто-нибудь знает, где я иду не так?

...