我想在某些情况下保存VideoCapture, 所以我写了以下代码:
date = datetime.now()
detector = dlib.get_frontal_face_detector()
cap = cv2.VideoCapture(1) #I use second camera
global count, no_face
total_number = 0
count = 0
no_face = 0
num_bad_posture = 0
not_detected_posture = 0
while True:
ret, frame = cap.read()
frame = cv2.resize(frame,None,fx=sf,fy=sf, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
dets = detector(gray,1)
if not dets:
print('no face')
no_face += 1
if no_face > 15:
print('no face!! for real!!')
now = str(date.now())
not_detected = cv2.resize(frame,None,fx=5,fy=5,interpolation = cv2.INTER_CUBIC)
not_detected_posture += 1
print(type(now))
cv2.imwrite('./images/non_detected/non_detected({0},{1}).jpg'. format(not_detected_posture,now),not_detected)
no_face=0
for i, d in enumerate(dets):
no_face = 0
w = d.width()
h = d.height()
x = d.left()
y = d.top()
如果我运行此代码,则不会保存该文件。
此外,如果我删除date.now()
并放置num_detected
,则会正确保存
我不知道文件名有什么问题(因为它的类型为str
,其他str
已正确保存。
如果我这样做
print(type(now),now)
我需要帮助。
答案 0 :(得分:0)
由于包含日期时间,问题可能出在文件名中的':'
或'.'
。我不确定是哪一个,因为你可以拥有包含那些文件名的文件名,你可以在python AFAIK中编写这样的文件名。因此,它可能是cv2
特有的问题。
答案 1 :(得分:0)
我会为文件名使用一组更有限的字符,避免使用空格,冒号,圆括号等字符。使用自定义日期时间格式生成所需表单的时间戳。
示例:
from datetime import datetime
from os import path
BASE_DIR = './images/non_detected'
PREFIX = 'non_detected'
EXTENSION = 'jpg'
file_name_format = "{:s}-{:d}-{:%Y%m%d_%H%M%S}.{:s}"
date = datetime.now()
not_detected_posture = 0
file_name = file_name_format.format(PREFIX, not_detected_posture, date, EXTENSION)
file_path = path.normpath(path.join(BASE_DIR, file_name))
# ---------
print("File name = '%s'" % file_name)
print("File path = '%s'" % file_path)
输出:
File name = 'non_detected-0-20170819_152459.jpg'
File path = 'images/non_detected/non_detected-0-20170819_152459.jpg'
简单,明确,便携。
也许还有一个改进。如果您大致了解将生成多少图像,则可以对数字进行零填充,以便按顺序对文件名进行排序。例如,如果您知道最多将有10000个,那么您可以执行
file_name_format = "{:s}-{:04d}-{:%Y%m%d_%H%M%S}.{:s}"
你得到一个像
这样的文件名File name = 'non_detected-0000-20170819_152459.jpg'