我有一个如下所示的文件结构:
Project
|
+-- video_1
| |
| +-- video_1_cropped
| |
| +--frame_00000.jpg
| +--frame_00001.jpg
| +...
| +—-frame_00359.jpg
|
+-- video_2
| |
| +-- video_2_cropped
| |
| +--frame_00000.jpg
| +--frame_00004.jpg
| +--frame_00005.jpg
| +…
| +—frame_00207.jpg
|
现在,这些帧并不都是连续编号的,因为它们之前已被处理过,并且并非每个帧都有资格被处理。我想知道是否可以遍历所有这些目录,检查10帧是否连续编号并将它们复制到另一个目录,在那里也创建一个新目录。新目录如下所示:
Videos
|
+-- video_00001
| |
| +--frame_00000.jpg
| +--frame_00001.jpg
| +...
| +--frame_00009.jpg
|
+-- video_00002
| |
| +--frame_00013.jpg
| +--frame_00014.jpg
| +...
| +--frame_00022.jpg
...
一些额外的注释,
(1) 我希望能够从同一视频复制多个 10 帧序列(如果存在多个此类序列)。
(2)如果视频中没有10帧序列,则可以跳过。
(3)如果序列长于10帧,那么我仍然希望将其分成10帧序列。因此,如果帧的编号为 10-59,那么我将创建 5 个新目录,每个目录中有 10 个帧(帧 10-19、20-29 等)
(4) 源视频不应相互关联,因为当将 10 帧序列复制到新目录时,它们无论如何都不会位于同一子目录中。因此,您应该能够从不同的视频多次复制相同的序列(例如 20-29)。
答案1
我只是决定为此编写一个 Python 脚本。如果有人感兴趣的话代码:
def process_pictures():
video_directory = '/path/to/videos/'
new_directory = '/path/to/sequences'
new = 1
for subdir, dirs, files in os.walk(video_directory):
if subdir[-7:] == 'cropped':
curr = -1
count = []
for file in sorted(files):
# get number
number = int(file[-9:-4])
# if the next file is consecutive
if number == curr + 1:
# increment current and add file to list
curr += 1
count.append(file)
# if we found 10 files
if len(count) == 10:
# zero pad new folder to be made
video_num = f'{new:05d}'
new += 1
dir_name = new_directory + '/video_' + video_num
# try to make new directory
try:
# Create target Directory
os.mkdir(dir_name)
print("Directory " , dir_name , " Created ")
except FileExistsError:
print("Directory " , dir_name , " already exists")
# loop through files and copy them to new directory
for f in count:
shutil.copy(os.path.join(subdir, f), dir_name)
# create new empty list
count = []
# if number is not consecutive, we reset the list and the current number
else:
count = [file]
curr = number
答案2
和zsh
:
typeset -Z5 destn=0
for dir in Project/video_<->/video_<->_cropped(Nn/); do
files=() i=
for file in $dir/*_<->.jpg(Nn.); do
num=${(M)${file:r}%%<->}
if [[ -z $i ]] || (( num == i + 1)); then
files+=($file)
if (( $#files == 10 )); then
(( destn++ ))
destdir=Videos/video_$destn
mkdir -p $destdir && cp $files $destdir/
files=() i=
continue
fi
else
files=($file)
fi
i=$num
done
done