다음과 같은 파일 구조가 있습니다.
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이면 각 디렉터리에 10개의 프레임이 있는 5개의 새 디렉터리를 만듭니다(프레임 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