【问题标题】:Copy images with EXIF(time) to new destination from several directories将带有 EXIF(时间)的图像从多个目录复制到新目标
【发布时间】:2018-09-04 15:34:36
【问题描述】:

我有一个问题,下面是我的根树: 在我的根中,我有:

 ---dir1---sub1(images exif time 10:05:05 to 10:09:55)
        ---sub2(images exif time 10:11:15 to 10:15:42)
        ---sub3(images exif time 10:22:15 to 10:24:41)
        ---sub4(images exif time 10:28:15 to 10:35:40)


 ---dir2---sub1(images exif time 10:05:06 to 10:09:57)
        ---sub2(images exif time 10:11:15 to 10:15:40)
        ---sub3(images exif time 10:22:15 to 10:24:43)
        ---sub4(images exif time 10:28:15 to 10:35:40)
        ---sub5(images exif time 10:40:15 to 10:43:40)

 ---dir3---sub1(images exif time 10:05:05 to 10:09:54)
        ---sub2(images exif time 10:11:15 to 10:15:40)
        ---sub3(images exif time 10:22:15 to 10:24:41)
        ---sub4(images exif time 10:28:15 to 10:35:40)
        ---sub5(images exif time 10:40:15 to 10:43:42)

 ---dir4---sub1(images exif time 10:05:06 to 10:09:57)
        ---sub2(images exif time 10:11:15 to 10:15:40)
        ---sub3(images exif time 10:22:15 to 10:24:43)
        ---sub4(images exif time 10:28:15 to 10:35:40)
        ---sub5(images exif time 10:40:15 to 10:43:40)

 ---dir5---sub1(images exif time 10:05:05 to 10:09:54)
        ---sub2(images exif time 10:11:15 to 10:15:40)
        ---sub3(images exif time 10:22:15 to 10:24:41)
        ---sub4(images exif time 10:28:15 to 10:35:40)
        ---sub5(images exif time 10:40:15 to 10:43:42)

我的根目录中有 5 个目录,每个目录都包含子文件夹(带有图像)子文件夹的数量它一直不一样,我想要做的是从第一个 - dir1 获取 sub1 并将其放入新的转到下一个目录(dir2)后的目标文件夹扫描子文件夹以检查exif(时间)是否与dir1中的sub1相同,并在转到下一个dir3后将其复制到同一目录并对所有其他dir-s和子文件夹执行相同操作,然后在创建 newdir2 后,从 dir1 中获取 sub2 并再次执行相同的循环直到结束...

类似:

   ---newdir1---sub1(from dir1)
             ---sub1(from dir2)
             ---sub1(from dir3)
             ---sub1(from dir4)
             ---sub1(from dir5)

   ---newdir2---sub2(from dir1)
             ---sub2(from dir2)
             ---sub2(from dir3)
             ---sub2(from dir4)
             ---sub2(from dir5)

   ---newdir3---sub3(from dir1)
             ---sub3(from dir2)
             ---sub3(from dir3)
             ---sub3(from dir4)
             ---sub3(from dir5)

   ---newdir4---sub4(from dir1)
             ---sub4(from dir2)
             ---sub4(from dir3)
             ---sub4(from dir4)
             ---sub4(from dir5)

   ---newdir5---sub5(from dir2)
             ---sub5(from dir3)
             ---sub5(from dir4)
             ---sub5(from dir5)

我有一部分脚本按时间间隔将我的图像排序到字典中,我如何将它加入我的脚本?让我的潜艇具有相同的密钥到相同的目录??:

import os
import exifread
from datetime import datetime, timedelta

TIME_RANGE = 2

src_root = 'F:\gopro_egouts\gopro_img_test\\2018-03-06'

dst_root = src_root + '-copie'

src_dirs_dict = {}

for cam_dir in os.listdir(src_root):
    laps_root = os.path.join(src_root, cam_dir)
    for lap_dir in os.listdir(laps_root):
        files_root = os.path.join(laps_root, lap_dir)
        min_time = None
        max_time = None
        for cam_file in os.listdir(files_root):
            with open(os.path.join(files_root, cam_file), 'rb') as f:
                tags = exifread.process_file(f, details=False, stop_tag="EXIF DateTimeOriginal")
                time_taken = tags.get("EXIF DateTimeOriginal")
                if time_taken:
                    file_time = datetime.strptime(str(time_taken), '%Y:%m:%d %H:%M:%S')
                    if min_time is not None:
                        if file_time < min_time:
                            min_time = file_time
                    else:
                        min_time = file_time

                    if max_time is not None:
                        if file_time > max_time:
                            max_time = file_time
                    else:
                        max_time = file_time


        is_key = None
        for key in src_dirs_dict.keys():
            if (min_time >= key[0] and min_time < key[1]) \
                    or (max_time >= key[0] and max_time < key[1]):
                is_key = key
                break
        min_time = min_time.replace(second=0)
        max_time = min_time + timedelta(minutes=TIME_RANGE)

        if is_key:

            key_min, key_max = is_key
            if min_time < key_min:
                key_min = min_time
            if max_time > key_max:
                key_max = max_time

            new_key = (key_min, key_max)

            if new_key == is_key:
                src_dirs_dict[new_key].append(files_root)
            else:

                src_dirs_dict[new_key] = src_dirs_dict.pop(is_key) + [files_root]
        else:
            new_key = (min_time, max_time)
            src_dirs_dict[new_key] = [files_root]


print(src_dirs_dict)

我的印刷品告诉我:

{(datetime.datetime(2018, 3, 6, 10, 31), datetime.datetime(2018, 3, 6, 10, 32)): ['F:\\gopro_egouts\\gopro_img_test\\2018-03-06\\CAM0101 1\\Time Lapse 3',...

我有一个运行良好的工作脚本,但一个接一个地获取子文件夹,当缺少一些延时时,我有一个问题,他混合我的子s(自动从下一个目录中获取下一个时间错误),我必须将我的 exif 脚本从上面添加到这里(如何修改它)...如何将它连接在一起???
任何帮助将不胜感激。

from collections import defaultdict
import shutil
import os
import re
src_root = r'F:\gp\gp_test\\2018-03-06'

dst_root = src_root + '-copie'

#os.makedirs(dst_root, exist_ok=True)

src_dirname, src_folders, _ = next(os.walk(src_root))
src_folders = sorted(src_folders)

src_folders = [os.path.join(src_root, folder) for folder in src_folders]
print(src_folders)
job = defaultdict(list)

print('mes {} dossier cam'.format(len(src_folders)))

for folder in src_folders:
    print()
    dirname, src_sub_folders, _ = next(os.walk(os.path.join(src_dirname, folder)))
    src_sub_folders = sorted(src_sub_folders, key=lambda x: [re.search(r'(\D+)', x).group(1)] + list(map(int, re.findall(r'\d+', x))))
    print("mes 5 CAM avec {} time laps '{}'".format(len(src_sub_folders), folder))

    for index, sub_folder in enumerate(src_sub_folders, start=1):
        job['Time Lapse-{}'.format(index)].append(os.path.join(dirname, sub_folder))

#print()

for dst_folder, src_folders in sorted(job.items()):
    for index, src_folder in enumerate(src_folders, start=1):
        dst_new_folder = os.path.join(dst_root, dst_folder, 'CAM-{}'.format(index))
        print('{} -> {}'.format(src_folder, dst_new_folder))
        shutil.copytree(src_folder, dst_new_folder)
#shutil.rmtree(src_root)

for root, dirs, files in os.walk(dst_root):
    for f in files:
        prefix = os.path.basename(root)
        prefix1 = os.path.basename(src_root)
        os.rename(os.path.join(root, f), os.path.join(root, "{}-{}-{}".format(prefix1, prefix, f)))
        print("images rennomer ")

print("fini")
print("dossier supprimé")

如果用户不清楚,我真的很抱歉,但英语不是我最擅长的语言......

【问题讨论】:

  • 您的问题实际上并没有说明您要做什么。我猜你在不同的时间录制了几个序列,你有 5 台摄像机在拍摄同一个场景?那么你想把来自 5 个不同摄像机的所有视频放在每个序列下的一个子目录中吗?或者您想将摄像机 1 的所有序列放在一个目录中,将摄像机 2 的所有序列放在另一个目录中?请尝试更清楚地解释。
  • 我已经编辑了我的帖子,希望这样会更清楚,我想做的和我的第一个脚本完全一样,但是使用 exif 将它们复制到新的 sub-s,我想将它们保存为他们是 - 正如我在上面演示的那样,新潜艇中的每个时间圈
  • 你展示了一个图表、一个脚本、另一个图表,然后是哪里出了问题,但你仍然没有清楚地说明你真正想要做什么。您在问题标题中提到了 EXIF,但您的代码和描述根本没有谈论 EXIF 数据。抱歉,我还是不明白这个问题。
  • 我已经编辑了我的帖子,希望现在会更好@Mark Setchell
  • @MarkSetchell 希望这会有所帮助并且更清楚

标签: python image exif gopro


【解决方案1】:

简而言之,您可以在多个摄像机上拍摄同一组事件的图像。

目前,它们首先按相机分组,然后按事件分组:

├── Camera1
│   ├── Event1
│   ├── Event2
│   ├── Event3
│   ├── Event4
│   └── Event5
├── Camera2
│   ├── Event1
│   ├── Event2
│   ├── Event3
│   ├── Event4
│   └── Event5
├── Camera3
│   ├── Event1
│   ├── Event2
│   ├── Event3
│   ├── Event4
│   └── Event5
├── Camera4
│   ├── Event1
│   ├── Event2
│   ├── Event3
│   ├── Event4
│   └── Event5
└── Camera5
    ├── Event1
    ├── Event2
    ├── Event3
    ├── Event4
    └── Event5

...其中一些事件可能会丢失并且事件编号可能不匹配,因为所有摄像机可能不会记录一个或多个事件。

您希望首先按事件分组的同一组图像,然后按相机:

├── Event1
│   ├── Camera1
│   ├── Camera2
│   ├── Camera3
│   ├── Camera4
│   └── Camera5
├── Event2
│   ├── Camera1
│   ├── Camera2
│   ├── Camera3
│   ├── Camera4
│   └── Camera5
├── Event3
│   ├── Camera1
│   ├── Camera2
│   ├── Camera3
│   ├── Camera4
│   └── Camera5
├── Event4
│   ├── Camera1
│   ├── Camera2
│   ├── Camera3
│   ├── Camera4
│   └── Camera5
└── Event5
    ├── Camera1
    ├── Camera2
    ├── Camera3
    ├── Camera4
    └── Camera5

这是一个想法……我有点 “大声思考” 的伪代码:

Create the output directories {Event1..EventN}/Camera{1..N}
MissingDirectory=false
for each input directory Camera{1..N}
    if this directory has the full number of subdirectories
        copy all subdirectories to output area
    else
        MissingDirectory=true
    end if
end for

if MissingDirectory
    for each output Event directory
        get times of all files from all cameras for current event
        sort list and take median time of current event
    end for
    for each un-copied input directory
        get the mean time of all the files in it
        assign this directory's files to output directory with nearest median time
    end for
endif

您可以使用以下命令将您的 EXIF 时间转换为自午夜 (s) 以来的纯秒数:

s = (hours*3600) + (minutes*60) + seconds

这是一种获取图像拍摄时间(从午夜开始以秒为单位)的方法:

import exifread

def getImageTime(filename):
    "Read EXIF data of given file and return time in seconds since midnight"
    f=open(filename,'rb')
    tags=exifread.process_file(f)
    DateTime=tags["EXIF DateTimeOriginal"].printable
    # DateTime looks like: "2013:03:09 08:59:50"
    Time=DateTime.split()[-1]
    # Time looks like: "08:59:50"
    h,m,s=Time.split(":")
    # Return seconds since midnight: 32390
    return (int(h)*3600) + (int(m)*60) + int(s)

s=getImageTime("image.jpg")
print(s)

经过深思熟虑,如果将其中一个摄像机设置为与其他摄像机相差 20 分钟,这将不会很好,因为它来自所有序列的所有图像都倾向于放入第一个或最后一个目录。需要更多思考...

【讨论】:

  • 意味着我必须使用时间模块??我是 python 的初学者你能指导我更多@Mark Setchell 我必须将它完全添加到我的脚本吗?
  • 不需要时间模块,你只是分割一个字段。 s="12:18:43" 然后hours, minutes,seconds=s.split(':')
  • 当我打印我的 exif timeTaken 加上文件名时,它会显示所有这样的图像 - 2018:03:06 11:29:26 G0091059.JPG
  • 当我将它添加到我的脚本时 - timeTaken.split(":") print(timeTaken)
  • 我有一条错误消息timeTaken.split(":") AttributeError: 'IfdTag' object has no attribute 'split'
猜你喜欢
  • 2020-03-22
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多