Очень упрощенным подходом может быть:
(a) Создание автоматизированного процесса для извлечения первого и последнего кадра каждого видеоклипа в известном формате изображения (например, JPG)и назовите их в соответствии с именами видеоклипов, например, если у вас есть видеоклипы:
clipA.avi, clipB.avi, clipC.avi
, вы можете создать следующие frame-images:
clipA_first.jpg, clipA_last.jpg, clipB_first.jpg, clipB_last.jpg, clipC_first.jpg, clipC_last.jpg
(b) Алгоритм сортировки:
1. Create a 'Clips' list of Clip-Records containing each:
(a) clip-name (string)
(b) prev-clip-name (string)
(c) prev-clip-diff (float)
(d) next-clip-name (string)
(e) next-clip-diff (float)
2. Apply the following processing:
for Each ClipX having ClipX.next-clip-name == "" do:
{
ClipX.next-clip-diff = <a big enough number>;
for Each ClipY having ClipY.prev-clip-name == "" do:
{
float ImageDif = ImageDif(ClipX.last-frame.jpg, ClipY.first_frame.jpg);
if (ImageDif < ClipX.next-clip-diff)
{
ClipX.next-clip-name = ClipY.clip-name;
ClipX.next-clip-diff = ImageDif;
}
}
Clips[ClipX.next-clip-name].prev-clip-name = ClipX.clip-name;
Clips[ClipX.next-clip-name].prev-clip-diff = ClipX.next-clip-diff;
}
3. Scan the Clips list to find the record(s) with no <prev-clip-name> or
(if all records have a <prev-clip-name> find the record with the max <prev-clip-dif>.
This is a good candidate(s) to be the first clip in sequence.
4. Begin from the clip(s) found in step (3) and rename the clip-files by adding
a 5 digits number (00001, 00002, etc) at the beginning of its filename and going
from aClip to aClip.next-clip-name and removing the clip from the list.
5. Repeat steps 3,4 until there are no clips in the list.
6. Voila! You have your sorted clips list in the form of sorted video filenames!
...or you may end up with more than one sorted lists (if you have enough
'time-gap' between your video clips).
Очень упрощенно ... но я думаю, что это может быть эффективным ...
PS1: Относительно функции ImageDif (): Вы можете создать новый DifImage , что представляет собой разницу изображений ClipX.last-frame.jpg, ClipY.first_frame.jpg, а затем суммирует все пиксели DifImage в одну плавающую точку ImageDif значение.Вы также можете оптимизировать процесс для отмены разницы (или суммирования), если ваша сумма больше некоторого предела: вас действительно интересуют небольшие различия.Значение ImageDif , которое больше (экспериментального) предела, означает, что 2 изображения отличаются настолько сильно, что 2 клипа не могут располагаться один за другим.
PS2: Порядок алгоритма сортировкисложности должны быть примерно O (n * log (n)), поэтому для 1000 видеоклипов будет выполнено около 3000 сравнений изображений (или чуть больше, если вы оптимизируете алгоритм и разрешаете ему не находить соответствия для некоторых клипов)