cv2.imwrite()仅保存最后一张图像

时间:2020-01-02 23:36:59

标签: python opencv image-processing cv2 image-capture

我正在尝试构建一个简短的脚本以使用我的立体声相机拍摄多张图像并将其保存 当我按下按钮时,将其移至目录。

但是由于某种原因,即使我拍摄了多张照片,我也只能得到最后一张图像。 它也不会显示任何错误,并且会像我在代码中编写的那样输出正确的字符串。 但是我得到的只是最后一对图像。

我看过几篇文章,但没有一个有同样的问题。

编辑:我没有按照此处所有人的建议在图像名称上添加Seconds,因此在同一分钟内拍摄时图像被覆盖了。

这是我完成的代码,如果有人想使用它:

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()

1 个答案:

答案 0 :(得分:4)

cv2.imwrite本身没有问题,而在于如何命名要保存的帧。您将框架命名为日+月+年_小时+分钟。这意味着您在给定分钟内保存的任何帧都将被该分钟内保存的最后一帧覆盖。例如,在19:00:23保存帧将被19:00:34保存的帧覆盖。 根据您的用例,您可以添加+ now.strftime("%S")以能够每秒保存一帧,或者甚至可以添加+ now.strftime("%S_%f")以达到毫秒精度。