(OpenCV)将日期放在文件名

时间:2017-08-19 08:09:11

标签: python python-2.7 opencv filenames

我想在某些情况下保存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)

enter image description here 它似乎

我需要帮助。

2 个答案:

答案 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'