Сохраните изображение в памяти, затем запишите на диск - PullRequest
0 голосов
/ 05 мая 2020

Этот фрагмент программы вырезает из кадра видео объекты, распознаваемые по цвету, и сохраняет их на диск.
Различает различные объекты по полному пути сохранения и идентификатору объекта. Потому что я хочу хранить картинки разных объектов в отдельной папке. До сих пор это работало хорошо. Однако для изображений с высоким разрешением непрерывное c прожигание дисков полностью останавливает программу.

Я бы попросил вашей помощи о том, как временно сохранить обрезанные изображения и их имена в памяти и записать их на диск в конец программы.

Я имею в виду обход cv.imwrite(os.path.join(path + cwd + str(objectID), fileName), crop_img), пока программа занята кадрированием изображений.

path = os.getcwd()
cwd = "/Data/"

for (objectID, centroid) in objects.items():
      # draw both the ID of the object and the centroid of the
      # object on the output frame
      text = "ID {}".format(objectID)
      cv.putText(frame, text, (centroid[0], centroid[1] - 20),
                 cv.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
      cv.circle(frame, (centroid[0], centroid[1]), 2, (255, 0, 0), -1)

      # coordinates for cropping
      ext_left = centroid[0] - 70
      ext_right = centroid[0] + 70
      ext_top = centroid[1] - 70
      ext_bot = centroid[1] + 70

      crop_img = frame[ext_top:ext_bot, ext_left:ext_right]

      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

1 Ответ

2 голосов
/ 05 мая 2020

Вы можете создать список и добавлять к нему каждое обрезанное изображение по мере их создания, например:

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. Генерация множества случайных чисел может быть медленной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...