我正在尝试构建一个简短的脚本,以便用我的立体相机拍摄多张图像并将其保存当我按下按钮时,将其转到目录。
但是出于某种原因,即使我拍摄了多张照片,我也只能得到最后一张图像。它也不会显示任何错误,并且会像我在代码中编写的那样输出正确的字符串。但是我得到的只是最后一张图像对。
我看过几篇文章,但都没有相同的问题。
这是我的代码:
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
leftColorFrame = leftFrame.copy()
rightColorFrame = rightFrame.copy()
stereoVideo = np.concatenate((leftColorFrame, rightColorFrame), axis=1)
cv2.imshow('Take Snapshots', stereoVideo)
key = cv2.waitKey(1) & 0xFF
# Saving image on keypress with timestamp
if key == ord('p'):
now = datetime.datetime.now()
if not cv2.imwrite(newpath_l + "/img_left_"
+ now.strftime("%d") + now.strftime("%m") + str(now.year)
+ "_"
+ now.strftime("%H") + now.strftime("%M")
+ ".png", leftColorFrame):
print("Left Snapshot not taken")
else:
print("Left Snapshot taken.")
if not cv2.imwrite(newpath_r + "/img_right_"
+ now.strftime("%d") + now.strftime("%m") + str(now.year)
+ "_"
+ now.strftime("%H") + now.strftime("%M")
+ ".png", rightColorFrame):
print("Right Snapshot not taken")
else:
print("Right Snapshot taken.")
if not cv2.imwrite(newpath + "/img_both_"
+ now.strftime("%d") + now.strftime("%m") + str(now.year)
+ "_"
+ now.strftime("%H") + now.strftime("%M")
+ ".png", stereoVideo):
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()
我想念什么吗?
cv2.imwrite
本身没有问题,而在于如何命名要保存的帧。您将框架命名为日+月+年_小时+分钟。这意味着您在给定分钟内保存的任何帧都将被该分钟内保存的最后一帧覆盖。例如,在19:00:23保存帧将被19:00:34保存的帧覆盖。根据您的用例,您可以添加+ now.strftime("%S")
以能够每秒保存一帧,或者甚至可以添加+ now.strftime("%S_%f")
以达到毫秒精度。