Вы можете создать список и добавлять к нему каждое обрезанное изображение по мере их создания, например:
crop_imgs = []
for (objectID, centroid) in objects.items():
...
crop_img = frame[ext_top:ext_bot, ext_left:ext_right]
crop_imgs.append((objectID, crop_img))
Мы добавляем кортеж из objectID
и самого изображения. Вы также можете использовать dict
, если хотите.
Затем разделите свое написание l oop здесь:
for (objectID, crop_img) in crop_imgs:
createFolder(path + cwd + str(objectID))
fileName = '%s.jpg' % (str(objectID) + str(uuid.uuid4()))
try:
cv.imwrite(os.path.join(path + cwd + str(objectID), fileName), crop_img)
except:
pass
Однако рассмотрите недостатки вашего предложения:
Общее время выполнения вашей программы останется прежним, но теперь вы не получите промежуточных результатов, записанных на диск. Если программа выйдет из строя, вы потеряете все и не сможете возобновить ее, не начав заново.
В отличие от видеофайла, изображения будут храниться в памяти без сжатия. Нет смысла оставлять доступную память go неиспользованной, но если вы исчерпаете доступную память, операционная система должна страница памяти на диск, что будет медленнее, чем если бы вы только что записали сжатые файлы JPEG. на каждом шаге.
Между прочим, даже без изменения кода вы можете использовать RAM-диск , который представляет собой виртуальную файловую систему, существующую только в RAM, а затем скопировать результаты на свой жесткий диск. Применяются те же предостережения.
Вы можете потенциально получить выигрыш в скорости, используя библиотеки threading
или multiprocessing
для добавления обработанных видеокадров в очередь, а другой поток / процесс выполняет кодирование в JPEG.
Еще одно небольшое улучшение: используйте увеличивающееся число вместо UUID. Генерация множества случайных чисел может быть медленной.