cv2.imwrite() сохраняет только последнее изображение

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

Но по какой-то причине я получаю только последнее изображение, даже если я сделал несколько снимков. Он также не показывает ошибок и выводит правильные строки, как я написал в своем коде. Но все, что я получаю, это последняя пара изображений.

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

РЕДАКТИРОВАТЬ: я не добавлял секунды к именам изображений, как предлагали все здесь, поэтому изображения были перезаписаны, поскольку они были сделаны в течение одной и той же минуты.

Вот мой готовый код, если кто-то хочет его использовать:

import numpy as np
import cv2
import os
import datetime

# shape of wholeFrame: (240, 640, 3)

cap = cv2.VideoCapture(1)
now = 0
imgs_taken = 0

newpath_l = "Recorded_Images/left_imgs"
newpath_r = "Recorded_Images/right_imgs"
newpath = "Recorded_Images/both_imgs"

if not os.path.exists(newpath_l):
    os.makedirs(newpath_l)
if not os.path.exists(newpath_r):
    os.makedirs(newpath_r)
if not os.path.exists(newpath):
    os.makedirs(newpath)

while 1:
    cap.grab()
    ret, wholeFrame = cap.retrieve()

    if ret:

        leftFrame = wholeFrame[:, 0:320, :]
        rightFrame = wholeFrame[:, 320:640, :]

        # Rectifying images here

        stereoImage = np.concatenate((leftFrame, rightFrame), axis=1)

        cv2.imshow('Take Snapshots', stereoImage)
        key = cv2.waitKey(1) & 0xFF

        # Saving images on keypress with timestamp
        if key == ord('p'):
            now = datetime.datetime.now()
            if not cv2.imwrite(newpath_l + now.strftime("/img_left_%d%m%Y_%H%M%S.png"), leftFrame):
                print("Left Snapshot not taken")
            else:
                print("Left Snapshot taken.")

            if not cv2.imwrite(newpath_r + now.strftime("/img_right_%d%m%Y_%H%M%S.png"), rightFrame):
                print("Right Snapshot not taken")
            else:
                print("Right Snapshot taken.")

            if not cv2.imwrite(newpath + now.strftime("/img_both_%d%m%Y_%H%M%S.png"), stereoImage):
                print("Stereo-Snapshot not taken")
            else:
                print("Stereo-Snapshot taken.")

            imgs_taken = imgs_taken + 1

        if key == ord('x'):
            print("Number of images taken: " + str(imgs_taken))
            break
    else:
        break

cv2.destroyAllWindows()
cap.release()

person user3019423    schedule 02.01.2020    source источник
comment
короче now.strftime("/img_left_%d%m%Y_%H%M.png")   -  person furas    schedule 03.01.2020
comment
вы должны использовать разные имена для изображений - если вы используете одну и ту же дату для всех изображений %d%m%Y_%H%M, тогда вы записываете все изображения в один файл - и, наконец, вы получаете только последнее изображение. Вы должны добавить секунды (%S) и/или миллисекунды (%s) к именам файлов   -  person furas    schedule 03.01.2020


Ответы (1)


Проблема не в самом cv2.imwrite, а в том, как вы называете кадры, которые сохраняете. Вы называете кадры как День + Месяц + Год _ Час + Минута. Это означает, что любой кадр, который вы сохраняете в течение данной минуты, будет заменен последним кадром, сохраненным в эту минуту. Сохранение кадра, скажем, в 19:00:23 будет заменено кадром, сохраненным в 19:00:34. В зависимости от вашего варианта использования вы можете добавить + now.strftime("%S"), чтобы иметь возможность сохранять один кадр каждую секунду, или вы даже можете добавить + now.strftime("%S_%f") для точности в миллисекундах.

person Bolat    schedule 03.01.2020
comment
Спасибо всем здесь, не могу поверить, что я этого не видел - person user3019423; 03.01.2020