Я пытаюсь создать приложение, которое будет захватывать изображения с трех камер 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 минут после запуска сценария) некоторые потоки кажутся зависшими / умирающимии камеры перестают фотографировать.
Кто-нибудь знает, где я иду не так?